剛開始調(diào)試虛擬串口以及編寫USART HMI串口屏的程序,花了很多時(shí)間的同時(shí),也學(xué)到了很多東西,有些心得分享給大家,希望初學(xué)者對串口有了更明確的認(rèn)識(shí)和了解。
想要驅(qū)動(dòng)串口屏,首先得了解串口屏接收的指令格式,就像玩游戲一樣,得熟悉基本的操作流程,才能更好地發(fā)揮其他技能。
一 串口屏的介紹
串口屏,顧名思義就是通過串口進(jìn)行數(shù)據(jù)的傳送,我使用的是串口屏,類型是增強(qiáng)型,型號(hào)是TJC4832K035_011R,尺寸為3.5寸,分辨率是483*320。
簡單的了解了串口屏,那么就以一個(gè)簡單的例子來介紹其使用方法。我們以串口屏發(fā)送文本程序?yàn)槔?/p>
串口屏發(fā)送的是ASCII碼,而且全部都是字符格式。
使用方法分成2個(gè)步驟:
1. 輸入發(fā)送文本指令
t0.text="1"
t0.txt是文本控件t0,1是數(shù)據(jù),在應(yīng)用的過程中可以換成其他字符。
2. 輸入結(jié)束確認(rèn)指令
0xff 0xff 0xff
串口屏指令格式規(guī)定每條指令寫完后,必須加3個(gè)0xff結(jié)尾,以確認(rèn)串口屏收到指令。
我們需要制作一個(gè)工程,下載到串口屏進(jìn)行顯示,以便后續(xù)進(jìn)行板機(jī)驗(yàn)證使用,如圖我們已經(jīng)建立好了一個(gè)工程,通過軟件USART HMI我們使用了文本控件和數(shù)字控件,然后對字體的格式,背景進(jìn)行設(shè)置。
二 虛擬串口的使用
下面我們利用proteus仿真模擬串口屏的指令格式發(fā)送數(shù)據(jù),首先我們需要?jiǎng)?chuàng)建2個(gè)虛擬端口。
如圖,打開虛擬串口驅(qū)動(dòng)軟件,然后直接點(diǎn)擊“添加端口”,就可以在左邊Virtual ports看到創(chuàng)建的2個(gè)虛擬端口,分別為COM1和COM2。和物理端口不同的是,物理端口直接是一個(gè)端口進(jìn)行串口通信,而虛擬端口是將2個(gè)端口建立了虛擬連接。
可以先用串口助手測試,確認(rèn)虛擬端口創(chuàng)建成功。打開串口助手SSCOM,
然后分別選擇端口COM1和COM2,然后互相發(fā)送數(shù)據(jù),可以看到,虛擬串口創(chuàng)建成功啦。
三 代碼分析
準(zhǔn)備工作基本準(zhǔn)備好了,下面可以編寫程序啦。
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
void init() //定時(shí)器1,工作方式2,8位自動(dòng)重裝,波特率9600
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
}
void uart(uchar b) //串行發(fā)送
{
SBUF=b;
while(!TI);
TI=0;
}
void sendText(uchar c[], uchar d[]) //發(fā)送文本
{
uchar table[]=".txt=\"";
for(i=0;i<2;i++) //發(fā)送標(biāo)號(hào)t?
uart(c[i]);
for(i=0;i<6;i++) //發(fā)送.txt="
uart(table[i]);
for(i=0;i<strlen(d);i++) //發(fā)送數(shù)據(jù)
uart(d[i]);
uart('\"'); //發(fā)送"
}
void sendVal(uchar c[], uchar d[]) //發(fā)送數(shù)字
{
uchar table[]=".val=";
for(i=0;i<2;i++) //發(fā)送標(biāo)號(hào)n?
uart(c[i]);
for(i=0;i<5;i++) //發(fā)送.val=
uart(table[i]);
for(i=0;i<strlen(d)-3;i++) //發(fā)送數(shù)據(jù),3是為了去掉小數(shù),才能識(shí)別成整數(shù)
uart(d[i]);
}
void sendEnd() //發(fā)送結(jié)束字符
{
for(i=0;i<3;i++) //發(fā)送3個(gè)0xff
uart(0xff);
}
void delayms(uint xms) //延時(shí)1ms
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
float a=666.234656;
uchar text[10];
sprintf(text,"%.2f",a);
init();
_nop_();
while(1)
{
sendText("t0","123"); //發(fā)送文本
sendEnd(); //發(fā)送結(jié)束字符
sendVal("n0",text); //發(fā)送數(shù)字
sendEnd();
delayms(1000);
}
}
四 系統(tǒng)調(diào)試
如果手頭沒有串口屏,我們可以先使用proteus進(jìn)行仿真,測試程序輸出結(jié)果是否準(zhǔn)確。
首先我們把仿真圖搭建好,其中虛擬終端(Virtual Terminal)的RTS和CTS官方例子是連在一起的,經(jīng)過測試不連也可以運(yùn)行。RS232端口的TXD是串行發(fā)送數(shù)據(jù),RXD是串行接收數(shù)據(jù)。
連接好電路之后,我們需要雙擊RS232端口,設(shè)置下對應(yīng)的參數(shù)。首先設(shè)置的是端口號(hào),經(jīng)過測試,物理端口和虛擬端口共用這個(gè)端口號(hào),我們先設(shè)置虛擬端口,后續(xù)板機(jī)測試的時(shí)候需要用到,根據(jù)自己的物理端口相應(yīng)修改。然后將波特率都設(shè)置為9600,和程序進(jìn)行匹配。
所有工作準(zhǔn)備完畢后,就可以燒程序進(jìn)行測試?yán)玻遣皇怯悬c(diǎn)小激動(dòng)。如圖是我通過仿真得到的結(jié)果,將發(fā)送給串口屏的數(shù)據(jù),通過虛擬終端以及過串口助手顯示的數(shù)據(jù)進(jìn)行顯示,有兩條指令,分別為發(fā)送文本指令t0.text="123"和數(shù)發(fā)送字指令n0.val=666,其中每條指令后必須有3個(gè)0xff。對于虛擬終端顯示為3個(gè)綠色的小方塊,對于串口助手顯示為3個(gè)空格。
因?yàn)槌绦蛑皇前l(fā)送數(shù)據(jù),所以串口屏的TX端可以懸空,只需將RX端與51單片機(jī)的P3.1(TXD)連接即可。如圖得出的結(jié)果是正確的,符合串口屏的指令要求,下面我們可以進(jìn)行板機(jī)下載驗(yàn)證。
在下載程序的時(shí)候,串口屏的RX和TX和51單片機(jī)的RXD和TXD要反接,否者無法通信。而且在下載程序的時(shí)候,因?yàn)榇谄梁蛦纹瑱C(jī)共用一個(gè)物理串口,最簡單的辦法是斷開串口屏的所有連接線,經(jīng)過測試發(fā)現(xiàn),我們只需要斷開串口屏的TX或者+5V其中一個(gè)引腳即可下載成功。
我們可以看出,串口屏的第一個(gè)文本框顯示“123”,第二個(gè)數(shù)字框顯示“666”,同時(shí)我們通過串口助手顯示的數(shù)據(jù)可以看出,和前面我們通過虛擬串口仿真結(jié)果相同,按照我們的程序架構(gòu)在執(zhí)行。
注意事項(xiàng):
- 出現(xiàn)在下載不了程序,看下驅(qū)動(dòng)是否安裝成功或者RX和TX是否接錯(cuò);
- 虛擬串口和實(shí)際串口不同,它是強(qiáng)行將2個(gè)不相干的串口虛擬導(dǎo)通,所以記得選串口的時(shí)候連接2個(gè)不同的串口;
- 發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,有時(shí)候用sscom串口助手下載程序的時(shí)候,最開始會(huì)出現(xiàn)一個(gè)空格,經(jīng)過多次實(shí)驗(yàn)發(fā)現(xiàn),板機(jī)驗(yàn)證先打開sscom串口助手的端口,然后在運(yùn)行程序可以避免這個(gè)問題,但是如果先打開sscom串口助手的端口就有這個(gè)空格,其他的串口助手不會(huì)出現(xiàn)這個(gè)問題,不知道是軟件的問題還是程序的問題,希望知道的告知,一起學(xué)習(xí),哈哈哈。