找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

电脑如何通过串口发送汉字给单片机?

[复制链接]
admin 发表于 2012-9-2 13:45:29 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本人想用电脑发送汉字然后显示在12864上,但试了N次都是乱码,如果用单片机给电脑发送汉字就没问题,哪位能简单的说说如何用发送汉字到单片机上??
匿名  发表于 2013-1-29 16:20:23
我估计问题出在中断上~~~电脑传给单片机用的应该是uart吧,是通过中断机制完成的。首先你所用的缓存不能是char型,应该用static char,防止编译器把你这个变量给优化了。其次你一定要给12864屏与串口传输的逻辑关系弄好,要知道在单片机刷屏时跳中断是很容易出现乱码的。最好是在上位/超级终端/串口调试助手 发送完数据后带一个数据结尾,单片机收到结尾标识符时暂时关闭所有中断在刷屏。还有你发送的汉字编码应该是gbk编码(windows貌似默认,主要是一般12864支持的汉字是这个编码的。)最后要是都不好使,估计你用了不带汉字编码库的12864(当然,一般能显示汉字就不会~~~~)
来自搜搜问问
vgalcd 发表于 2013-3-21 15:50:27 | 显示全部楼层
void InitUART(void)         //串口初始化使用22.1184M晶体
{
          SCON = 0x50;                     //选择模式1,8位数据格式,使能UART
           PCON |= 0x80;                    //波特率加倍
           TMOD =TMOD| 0x20;                 //定时器1:模式2 ,自动装载初值        
        //波特率计算公式:TH1=TL1=256-(2*22.1184*1000000)/(32*12*baud)
        //若选115200波特率则TH1=TL1=256-(2*22.1184*1000000)/(32*12*115200)=0xff
        //若选19200波特率则TH1=TL1=256-(2*22.1184*1000000)/(32*12*19200)=0xfa
           TH1 = 0xfa;                     
           TL1 = 0xfa;
        TR1 = 1;                             //定时器1计数使能
        REN = 1;                //允许串口接受使能
}
/*
******************************************************************
*
* 名称:    write_byte()
* 功能:    向串口发送一个字节的数据
* 入口参数:i为待发送的字节数据
******************************************************************
*/

void UART_SendByte(unsigned char i)
{
        SBUF=i;              //发送本次数据
        while(TI==0){}//等待发送完毕
    TI=0;
}


void SetVariable(unsigned int adr,unsigned short nBytes,unsigned char *m_VarP)
{
    unsigned char temp;
    unsigned short m_CheckCRC;//命令校验
        UART_SendByte(0x81);        //开始,固定,一个字节
        UART_SendByte(0x0);                //命令类型,设置变量
        UART_SendByte(0x2);                //接收方的设备号
        m_CheckCRC=0x81+0x0+0x2;
        temp=adr&0xff;
        UART_SendByte(temp);        //地址1
        m_CheckCRC=m_CheckCRC+temp;
        temp=(adr>>8)&0xff;
        UART_SendByte(temp);        //地址2
        m_CheckCRC=m_CheckCRC+temp;
        temp=(adr>>16)&0xff;
        UART_SendByte(temp);        //地址3
        m_CheckCRC=m_CheckCRC+temp;
        temp=(adr>>24)&0xff;
        UART_SendByte(temp);        //地址4
        m_CheckCRC=m_CheckCRC+temp;       
        temp=(nBytes)&0xff;
        UART_SendByte(temp);        //个数低8位
        m_CheckCRC=m_CheckCRC+temp;                       
        temp=(nBytes>>8)&0xff;
        UART_SendByte(temp);        //个数高8位
        m_CheckCRC=m_CheckCRC+temp;       
        while(nBytes!=0)
        {
            temp=*m_VarP;
                UART_SendByte(temp);       
                m_CheckCRC=m_CheckCRC+temp;       
            nBytes--;
            m_VarP++;
        }
        UART_SendByte(m_CheckCRC);
        UART_SendByte(m_CheckCRC>>8);
}
vgalcd 发表于 2013-3-21 15:51:36 | 显示全部楼层
加我的QQ:252631158.大家交流讨论一下哦。我对这个还是比较熟的。
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 19:03 , Processed in 0.063240 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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