找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2696|回复: 2
收起左侧

显示汉字<UART>下位机51单片机 上位机 易语言

[复制链接]
ID:878235 发表于 2021-1-16 23:16 | 显示全部楼层 |阅读模式
用单片机,发送汉字字符串,通过RS-232 传送到电脑电脑 用易语言,接收汉字字符串,并且显示汉字

数据格式
开始  长度  数据区  校验

本例题包含了,串口发送时的问题
1 时差
2 数据的属性
3 丢包


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:878235 发表于 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   

回复

使用道具 举报

ID:878235 发表于 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, 变量_长度位))


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表