搜索
bottom↓
回复: 4

请教:串口通信时怎样发送中文字符??&LCD1602/12864送数据方式不同??

[复制链接]

出0入0汤圆

发表于 2009-8-12 12:59:45 | 显示全部楼层 |阅读模式
大家好,我是这个论坛的新成员,刚学AVR不到一个月。这段时间在搞AVR的串口通信时遇到一个问题,就是在写串口通信程序时怎么将中文字符串发送到电脑让串口调试助手显示出来,我下载了几个串口调试助手,有些是可以显示单片机发送过来的中文字符的,但有些却不能。现在我就想知道可不可以在写单片机串口通信程序的时候将中文字符串转换成某种格式的编码再发送到串口调试助手显示出来呢??我先贴出我的串口通信程序的主要部分:
//主函数
int main(void)            
{
        Port_Init();//端口,寄存器初始化
        Usart_Init();
       
        Usart_PutString("知识共享");
        Usart_PutString("^_^");
       
        sei();          //使能全局中断  
       
        while(1)
        {
               
        }
}
//字节发送函数
void Usart_PutChar(unsigned char cTXData)
{
        while( !(UCSRA & (1 << UDRE)) );  //只有数据寄存器为空时才能发送数据
        UDR = cTXData;                         //发送数据送USART I/O数据寄存器-UDR
}
//字符串发送
void Usart_PutString(unsigned char *pcString)
{
        while (*pcString)
        {
                Usart_PutChar(*pcString++);
        }
        Usart_PutChar(0x0D);
        Usart_PutChar(0x0A);  //结尾发送回车换行
}

这里可能涉及到的是编码的知识,我对这方面了解甚少,所以希望大家指教!在这里我还想问一个问题,就是关于LCD1602和LCD12864送显示数据时候的区别,我在写LCD1602/12864的显示程序的时候发现下面这个问题:
在写字符数据到LCD时,为什么写入LCD1602的可以不用指针来送数据,但写到12864一定要用指针来送数据?
LCD1602可以这样写数据
//在指定的(x,y)位置写入字符数据
void Write_Data_Char(unsigned char x,unsigned char y,unsigned char Data)
{
     Write_Place_xy(x,y);//写显示地址
         _delay_ms(1);
         Write_Data_Byte(Data);//写数据
}
而LCD12864要这样来写数据
//指定位置显示一个字符
void Write_Data_Char(uchar x,uchar y,uchar *LCD_Data)
{
     Write_Address(x,y);//写显示地址
         _delay_ms(1);
         Write_Data_Byte(*LCD_Data);//一定要用指针来送数据,跟1602不同
}


期待马老师还有论坛的其他大哥大姐们的答案,先说声谢谢!^_^......

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-8-12 14:59:07 | 显示全部楼层
中文字符发内码
C51汉字解决方案
用超级终端接收
对于第二个问题,关键是Write_Data_Byte(uchar data)这样定义的还是Write_Data_Byte(uchar *data)这样定义的

出0入0汤圆

 楼主| 发表于 2009-8-12 17:01:35 | 显示全部楼层
呵呵,很感谢1楼的大哥帮我解答!对于第二个问题,之前我用过的是像写1602这样来写的程序,即这种方式:
//在指定的(x,y)位置写入字符数据
void Write_Data_Char(unsigned char x,unsigned char y,unsigned char Data)
{
     Write_Place_xy(x,y);//写显示地址
_delay_ms(1);
Write_Data_Byte(Data);//写数据
}
但是发现显示不出来,不管是在仿真还是在硬件上,可能是我程序的其它部分出现错误吧,我再试试看!

出0入0汤圆

发表于 2009-8-12 17:12:03 | 显示全部楼层
第二个问题
  Write_Data_Byte(Data);
  Write_Data_Byte(*LCD_Data);
这两种写法都正确,都是传递一个值,区别就是Data里就是数据,而LCD_Data里是该数据的地址,*LCD_Data仍然是数据

出0入0汤圆

 楼主| 发表于 2009-8-12 17:20:15 | 显示全部楼层
呵呵,很感谢cqfeiyu大哥这么耐心给我讲解,我明白了,谢谢您!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 20:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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