標(biāo)題:
顯示漢字<UART>下位機51單片機 上位機 易語言
[打印本頁]
作者:
zpmpok001
時間:
2021-1-16 23:16
標(biāo)題:
顯示漢字<UART>下位機51單片機 上位機 易語言
用單片機,發(fā)送漢字字符串,通過RS-232 傳送到電腦電腦 用易語言,接收漢字字符串,并且顯示漢字
數(shù)據(jù)格式
開始 長度 數(shù)據(jù)區(qū) 校驗
本例題包含了,串口發(fā)送時的問題
1 時差
2 數(shù)據(jù)的屬性
3 丟包
作者:
zpmpok001
時間:
2021-1-16 23:18
//數(shù)據(jù)包格式
// 開始 長度 數(shù)據(jù)1 數(shù)據(jù)2 數(shù)據(jù)N 校驗
// BEGIN 3 0XF1 0XF4 0XF5 0X00 0XF6
#include <reg52.H>
//===============================================================
//==============數(shù)據(jù)包 相關(guān)變量 函數(shù)=============================
//===============================================================
//原始數(shù)據(jù)
char YS_DATA[32];
// 數(shù)據(jù)包
char PACKET[32+8];
// 數(shù)據(jù)長度
char DATA_SIZE;
//數(shù)據(jù)校驗
int DATA_FCS;
//以上是數(shù)據(jù)包 結(jié)構(gòu)
//=============================
char *P_HZ;//存放漢字
// 格式 漢字序列 格式符 \0
// 例如 你好,我是張平 \0
void ADD_DATA(); //裝載原始數(shù)據(jù)
void ADD_BEGIN();//添加 開始標(biāo)志 BEGIN
void ADD_SIZE(); //添加 大小標(biāo)志
void ADD_FCS(); //添加 校驗標(biāo)志
void ADD_DATA()
{//裝載原始數(shù)據(jù)
char i;
for(i=0;i<DATA_SIZE;i++)
{
PACKET[i+6]=YS_DATA[i];
}
}
void ADD_BEGIN()
{//添加 開始標(biāo)志 BEGIN
PACKET[0]='B';
PACKET[1]='E';
PACKET[2]='G';
PACKET[3]='I';
PACKET[4]='N';
}
void ADD_SIZE()
{//添加 大小標(biāo)志
PACKET[5]=DATA_SIZE;
}
void ADD_FCS()
{//添加 校驗標(biāo)志
int bdata num;
int bdata n1,n2;
n1=YS_DATA[0];
n2=YS_DATA[DATA_SIZE-1];
//取出數(shù)據(jù)
n1=n1&0x00ff;
n2=n2&0x00ff;
//8bit 變 16bit
num=n1+n2;
//計算校驗
PACKET[DATA_SIZE+6]=num>>8;
PACKET[DATA_SIZE+6+1]=num;
}
//===============================================================
//============== 數(shù)據(jù)包 END =============================
//===============================================================
//===============================================================
//============== UART 相關(guān) =============================
//===============================================================
void rs232_init(void)
{//初始化
SCON=0x50; //設(shè)定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率
EA=1;
ES = 1; //允許串口中斷
//---------------------------------------
TL1=0xA0; //波特率9600
TH1=0xFF;
//--------------------------------------
TR1=1;
}
void senddata(char dat)
{//發(fā)送一個字節(jié)
TI = 0;
SBUF = dat;
while(!TI);
}
//===============================================================
//============== UART 相關(guān) END ===========================
//===============================================================
//===============================================================
//============== 漢字處理 ===========================
//===============================================================
//1 置漢字
//2 取漢字
//3 取個數(shù)
char HZ_GET_NUM(char *XC_P)
{//3 取個數(shù) 不算0
char n;
for(n=0;XC_P[n]!='\0';n++);
//逐個檢查\0 判斷漢字串中有多少個有效字符
return(n);
}
void HZ_SET(char *XC_P)
{//1 置漢字
char i;
for(i=0;i<=HZ_GET_NUM(XC_P);i++)
{
YS_DATA[i]=XC_P[i];
}
}
char * HZ_GET(char *XC_P)
{//2 取漢字
return(XC_P);
}
//char YS_DATA[16];
//// 數(shù)據(jù)包
//char PACKET[16+8];
//// 數(shù)據(jù)長度
//char DATA_SIZE;
////數(shù)據(jù)校驗
//int DATA_FCS;
////以上是數(shù)據(jù)包 結(jié)構(gòu)
main()
{
char i;
//========裝載漢字================
HZ_SET("你好,我是張平"); //裝入指針
DATA_SIZE=HZ_GET_NUM("你好,我是張平");//取漢字長度 不包括0
//153 0435 2265
//封包
ADD_DATA(); //添加原始數(shù)據(jù)
ADD_BEGIN();//添加開始
ADD_SIZE();//添加 長度
ADD_FCS();//添加校驗
rs232_init();
//數(shù)據(jù)包格式 開始 長度 數(shù)據(jù)1 數(shù)據(jù)2 數(shù)據(jù)N 校驗
for(i=0;i<10;i++)
{//自動停止發(fā)送,10次
for(i=0;i<=DATA_SIZE+6+1;i++)
{
senddata(PACKET[i]);
yc(8);
}
}
}
// 0 1 2 3 4 5 6 7 8 9
// 42 45 47 49 4E 02 C4 E3 01 A7
作者:
zpmpok001
時間:
2021-1-16 23:18
.版本 2
.支持庫 spec
.程序集 窗口程序集1
.子程序 _端口1_數(shù)據(jù)到達(dá)
.參數(shù) 數(shù)據(jù)字節(jié)值, 整數(shù)型
調(diào)試輸出 (數(shù)據(jù)字節(jié)值)
函數(shù)_裝載 (數(shù)據(jù)字節(jié)值)
' 調(diào)試輸出 (“數(shù)據(jù):” + 到文本 (數(shù)據(jù)字節(jié)值) + “定位:” + 到文本 (變量_定位))
.子程序 __啟動窗口_創(chuàng)建完畢
變量_數(shù)據(jù) = 到字節(jié)集 (“AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGG”)
變量_定位 = 0
變量_開始位 [1] = 0
變量_開始位 [2] = 0
變量_開始位 [3] = 0
變量_開始位 [4] = 0
變量_開始位 [5] = 0
變量_長度位 = 0
變量_校驗高 = 0
.子程序 函數(shù)_裝載, 整數(shù)型, , 審查成功 0 失敗 12345 開始 6 長度 7。。數(shù)據(jù)
.參數(shù) 參數(shù)_1, 整數(shù)型
.如果 (參數(shù)_1 = 66)
變量_定位 = 0
.否則
.如果結(jié)束
變量_定位 = 變量_定位 + 1
' 判斷開始,并裝載數(shù)據(jù)
' 并不對開始位進(jìn)行檢查
.判斷開始 (變量_定位 = 1)
變量_開始位 [1] = 參數(shù)_1
.判斷 (變量_定位 = 2)
變量_開始位 [2] = 參數(shù)_1
.判斷 (變量_定位 = 3)
變量_開始位 [3] = 參數(shù)_1
.判斷 (變量_定位 = 4)
變量_開始位 [4] = 參數(shù)_1
.判斷 (變量_定位 = 5)
變量_開始位 [5] = 參數(shù)_1
.默認(rèn)
.判斷結(jié)束
' BEGIN
.判斷開始 (變量_定位 = 6)
變量_長度位 = 參數(shù)_1
.默認(rèn)
.判斷結(jié)束
' 長度
.判斷開始 (變量_定位 = 5 + 1 + 變量_長度位 + 1)
變量_校驗高 = 參數(shù)_1
.默認(rèn)
.判斷結(jié)束
.判斷開始 (變量_定位 = 5 + 1 + 變量_長度位 + 1 + 1)
變量_校驗低 = 參數(shù)_1
.默認(rèn)
.判斷結(jié)束
.判斷開始 (字符 (變量_開始位 [1]) + 字符 (變量_開始位 [2]) + 字符 (變量_開始位 [3]) + 字符 (變量_開始位 [4]) + 字符 (變量_開始位 [5]) = “BEGIN”)
.判斷開始 (變量_定位 > 5 + 1 且 變量_定位 < 5 + 1 + 變量_長度位 + 1)
變量_數(shù)據(jù) [變量_定位] = 到字節(jié) (參數(shù)_1)
' 調(diào)試輸出 (“裝載數(shù)據(jù):” + 到文本 (到字節(jié) (參數(shù)_1)) + “ ” + 到文本 (變量_定位))
.默認(rèn)
.判斷結(jié)束
.默認(rèn)
.判斷結(jié)束
返回 (變量_定位)
.子程序 _按鈕1_被單擊
.局部變量 i, 整數(shù)型
編輯框BEGIN.內(nèi)容 = 字符 (變量_開始位 [1]) + 字符 (變量_開始位 [2]) + 字符 (變量_開始位 [3]) + 字符 (變量_開始位 [4]) + 字符 (變量_開始位 [5])
編輯框長度.內(nèi)容 = 到文本 (變量_長度位)
編輯框校驗.內(nèi)容 = “”
編輯框校驗.內(nèi)容 = 到文本 (變量_校驗高)
編輯框校驗.內(nèi)容 = 編輯框校驗.內(nèi)容 + “|”
編輯框校驗.內(nèi)容 = 編輯框校驗.內(nèi)容 + 到文本 (變量_校驗低)
編輯框內(nèi)容.內(nèi)容 = “”
.計次循環(huán)首 (變量_長度位, i)
編輯框內(nèi)容.內(nèi)容 = 編輯框內(nèi)容.內(nèi)容 + “|”
編輯框內(nèi)容.內(nèi)容 = 編輯框內(nèi)容.內(nèi)容 + 到文本 (變量_數(shù)據(jù) [i + 6])
.計次循環(huán)尾 ()
編輯框漢字顯示.內(nèi)容 = 到文本 (取字節(jié)集中間 (變量_數(shù)據(jù), 7, 變量_長度位))
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1