标题:
显示汉字<UART>下位机51单片机 上位机 易语言
[打印本页]
作者:
zpmpok001
时间:
2021-1-16 23:16
标题:
显示汉字<UART>下位机51单片机 上位机 易语言
用单片机,发送汉字字符串,通过RS-232 传送到电脑电脑 用易语言,接收汉字字符串,并且显示汉字
数据格式
开始 长度 数据区 校验
本例题包含了,串口发送时的问题
1 时差
2 数据的属性
3 丢包
作者:
zpmpok001
时间:
2021-1-16 23:18
//数据包格式
// 开始 长度 数据1 数据2 数据N 校验
// BEGIN 3 0XF1 0XF4 0XF5 0X00 0XF6
#include <reg52.H>
//===============================================================
//==============数据包 相关变量 函数=============================
//===============================================================
//原始数据
char YS_DATA[32];
// 数据包
char PACKET[32+8];
// 数据长度
char DATA_SIZE;
//数据校验
int DATA_FCS;
//以上是数据包 结构
//=============================
char *P_HZ;//存放汉字
// 格式 汉字序列 格式符 \0
// 例如 你好,我是张平 \0
void ADD_DATA(); //装载原始数据
void ADD_BEGIN();//添加 开始标志 BEGIN
void ADD_SIZE(); //添加 大小标志
void ADD_FCS(); //添加 校验标志
void ADD_DATA()
{//装载原始数据
char i;
for(i=0;i<DATA_SIZE;i++)
{
PACKET[i+6]=YS_DATA[i];
}
}
void ADD_BEGIN()
{//添加 开始标志 BEGIN
PACKET[0]='B';
PACKET[1]='E';
PACKET[2]='G';
PACKET[3]='I';
PACKET[4]='N';
}
void ADD_SIZE()
{//添加 大小标志
PACKET[5]=DATA_SIZE;
}
void ADD_FCS()
{//添加 校验标志
int bdata num;
int bdata n1,n2;
n1=YS_DATA[0];
n2=YS_DATA[DATA_SIZE-1];
//取出数据
n1=n1&0x00ff;
n2=n2&0x00ff;
//8bit 变 16bit
num=n1+n2;
//计算校验
PACKET[DATA_SIZE+6]=num>>8;
PACKET[DATA_SIZE+6+1]=num;
}
//===============================================================
//============== 数据包 END =============================
//===============================================================
//===============================================================
//============== UART 相关 =============================
//===============================================================
void rs232_init(void)
{//初始化
SCON=0x50; //设定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;
ES = 1; //允许串口中断
//---------------------------------------
TL1=0xA0; //波特率9600
TH1=0xFF;
//--------------------------------------
TR1=1;
}
void senddata(char dat)
{//发送一个字节
TI = 0;
SBUF = dat;
while(!TI);
}
//===============================================================
//============== UART 相关 END ===========================
//===============================================================
//===============================================================
//============== 汉字处理 ===========================
//===============================================================
//1 置汉字
//2 取汉字
//3 取个数
char HZ_GET_NUM(char *XC_P)
{//3 取个数 不算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];
//// 数据包
//char PACKET[16+8];
//// 数据长度
//char DATA_SIZE;
////数据校验
//int DATA_FCS;
////以上是数据包 结构
main()
{
char i;
//========装载汉字================
HZ_SET("你好,我是张平"); //装入指针
DATA_SIZE=HZ_GET_NUM("你好,我是张平");//取汉字长度 不包括0
//153 0435 2265
//封包
ADD_DATA(); //添加原始数据
ADD_BEGIN();//添加开始
ADD_SIZE();//添加 长度
ADD_FCS();//添加校验
rs232_init();
//数据包格式 开始 长度 数据1 数据2 数据N 校验
for(i=0;i<10;i++)
{//自动停止发送,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_数据到达
.参数 数据字节值, 整数型
调试输出 (数据字节值)
函数_装载 (数据字节值)
' 调试输出 (“数据:” + 到文本 (数据字节值) + “定位:” + 到文本 (变量_定位))
.子程序 __启动窗口_创建完毕
变量_数据 = 到字节集 (“AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGG”)
变量_定位 = 0
变量_开始位 [1] = 0
变量_开始位 [2] = 0
变量_开始位 [3] = 0
变量_开始位 [4] = 0
变量_开始位 [5] = 0
变量_长度位 = 0
变量_校验高 = 0
.子程序 函数_装载, 整数型, , 审查成功 0 失败 12345 开始 6 长度 7。。数据
.参数 参数_1, 整数型
.如果 (参数_1 = 66)
变量_定位 = 0
.否则
.如果结束
变量_定位 = 变量_定位 + 1
' 判断开始,并装载数据
' 并不对开始位进行检查
.判断开始 (变量_定位 = 1)
变量_开始位 [1] = 参数_1
.判断 (变量_定位 = 2)
变量_开始位 [2] = 参数_1
.判断 (变量_定位 = 3)
变量_开始位 [3] = 参数_1
.判断 (变量_定位 = 4)
变量_开始位 [4] = 参数_1
.判断 (变量_定位 = 5)
变量_开始位 [5] = 参数_1
.默认
.判断结束
' BEGIN
.判断开始 (变量_定位 = 6)
变量_长度位 = 参数_1
.默认
.判断结束
' 长度
.判断开始 (变量_定位 = 5 + 1 + 变量_长度位 + 1)
变量_校验高 = 参数_1
.默认
.判断结束
.判断开始 (变量_定位 = 5 + 1 + 变量_长度位 + 1 + 1)
变量_校验低 = 参数_1
.默认
.判断结束
.判断开始 (字符 (变量_开始位 [1]) + 字符 (变量_开始位 [2]) + 字符 (变量_开始位 [3]) + 字符 (变量_开始位 [4]) + 字符 (变量_开始位 [5]) = “BEGIN”)
.判断开始 (变量_定位 > 5 + 1 且 变量_定位 < 5 + 1 + 变量_长度位 + 1)
变量_数据 [变量_定位] = 到字节 (参数_1)
' 调试输出 (“装载数据:” + 到文本 (到字节 (参数_1)) + “ ” + 到文本 (变量_定位))
.默认
.判断结束
.默认
.判断结束
返回 (变量_定位)
.子程序 _按钮1_被单击
.局部变量 i, 整数型
编辑框BEGIN.内容 = 字符 (变量_开始位 [1]) + 字符 (变量_开始位 [2]) + 字符 (变量_开始位 [3]) + 字符 (变量_开始位 [4]) + 字符 (变量_开始位 [5])
编辑框长度.内容 = 到文本 (变量_长度位)
编辑框校验.内容 = “”
编辑框校验.内容 = 到文本 (变量_校验高)
编辑框校验.内容 = 编辑框校验.内容 + “|”
编辑框校验.内容 = 编辑框校验.内容 + 到文本 (变量_校验低)
编辑框内容.内容 = “”
.计次循环首 (变量_长度位, i)
编辑框内容.内容 = 编辑框内容.内容 + “|”
编辑框内容.内容 = 编辑框内容.内容 + 到文本 (变量_数据 [i + 6])
.计次循环尾 ()
编辑框汉字显示.内容 = 到文本 (取字节集中间 (变量_数据, 7, 变量_长度位))
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1