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