BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #2750同步于 2008/11/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

c51串口通信问题

buchuanneiku
2008/11/22镜像同步8 回复
用keil c 仿真串口输入 就是用peripheral里的serial 下边是一部分代码 seri_int () interrupt 4 using 1//串口中断源 { uchar i; uchar rece_data; uchar verify=0; rece_data=SBUF; .... ...} 能看到sbuf是0xaa 单步走到rece_data=SBUF;rece_data 的值还是0x00 就是说没有赋给那个变量~~为什么 大牛们 ?
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
buchuanneiku机器人#1 · 2008/11/22
在网上搜索了一下 大概知道不能用serial这个来修改sbuf的值 可以通过serial window #1 来输入相应的字符 但是新问题又来了 在那个串口串口中输入 只能0-128 也就是输入的字符是按照ASCII码转换的 比如按 “a” sbuf就接收到a的ASCII码的值 或者按住alt键输入十进制的数 但是也会限制在128以内的数是正确的 一超过 比如我按住alt键输入129 sbuf接收到的数值就是乱的了 所以要输入0-128以内的数都好办 但是我希望得到一个十六进制是0xaa 的数 怎么办?
hobby机器人#2 · 2008/11/24
你的代码是按照哪个模板改的? 建议可以参考下uboot里面串口处理的相应部门,好像不怎么难
sweetfly机器人#3 · 2008/11/24
不太清楚51里面串口是如何通信的。我来说说AVR 单片机是如何通信,希望能够对你有帮助。 AVR MCU里面的串口,有两个寄存器控制收发(状态控制器,数据寄存器)。 在做发送操作的时候,首先时能寄存器发送位,并将数据放在数据寄存器里面,串口发送完后,MCU会自动将控制寄存器里的发送位清零。 在做接收操作的时候,首先时能寄存器接收位,然后在读取数据寄存器里面的数据,MCU同样会对控制器寄存器里面接收位清零。 我感觉是在做串口收发的时候,有一个buffer,首先将数据填充,就像压子弹一样,发送一个(或者接收一个数据),再把下一个数据压到数据寄存器里面。也就是先进先出吧。 :-),理解就这么多了,不对的地方,大家请多交流交流。
sweetfly机器人#4 · 2008/11/24
void tran(unsigned char c) { while (!(UCSR0A&(1<<5)));------ UDR0=c; } 贴个程序讲解更直观。 UCSR0A---控制寄存器, UDR0----数据寄存器; 1<<5---- 寄存器第5位是发送时能; 程序实现的功能就是将C 通过串口发送出去。
sweetfly机器人#5 · 2008/11/24
【 在 buchuanneiku 的大作中提到: 】 : 在网上搜索了一下 大概知道不能用serial这个来修改sbuf的值 可以通过serial window #1 来输入相应的字符 但是新问题又来了 在那个串口串口中输入 只能0-128 也就是输入的字符是按照ASCII码转换的 比如按 “a” sbuf就接收到a的ASCII码的值 或者按住alt键输入十进制的数 但是也会限制在128以内的数是正确的 一超过 比如我按住alt键输入129 sbuf接收到的数值就是乱的了 所以要输入0-128以内的数都好办 但是我希望得到一个十六进制是0xaa 的数 怎么办? 你串口数据寄存器是16位的吗? 如果不是的话,一次就不能够接收16位的数据啊。:-)
buchuanneiku机器人#6 · 2008/11/25
我现在下了一个keil com tool的工具可以向keil的模拟串口任意发送16位数据。 我之前描述的问题是 我的串口数据寄存器 (c51的是SBUF)是8位 通过keil仿真向串口发数据只能发十进制128以下的数据。比如我要发数值为0x18的数 我可以在串口窗口中按下ASCII码对应的为0x18的键或者按住alt键输入18 但是如果我要发送0xaa就不知道怎么发了
sweetfly机器人#7 · 2008/11/26
分两次发不就行了吗?
cofday机器人#8 · 2008/12/4
晕死了,0XAA不是8位吗 怎么成了16位的了,是16进制吧