返回信息流用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 就是说没有赋给那个变量~~为什么 大牛们 ?
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #2750同步于 2008/11/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
c51串口通信问题
buchuanneiku
2008/11/22镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
在网上搜索了一下 大概知道不能用serial这个来修改sbuf的值 可以通过serial window #1 来输入相应的字符 但是新问题又来了 在那个串口串口中输入 只能0-128 也就是输入的字符是按照ASCII码转换的 比如按 “a” sbuf就接收到a的ASCII码的值 或者按住alt键输入十进制的数 但是也会限制在128以内的数是正确的 一超过 比如我按住alt键输入129 sbuf接收到的数值就是乱的了 所以要输入0-128以内的数都好办 但是我希望得到一个十六进制是0xaa 的数 怎么办?
不太清楚51里面串口是如何通信的。我来说说AVR 单片机是如何通信,希望能够对你有帮助。
AVR MCU里面的串口,有两个寄存器控制收发(状态控制器,数据寄存器)。
在做发送操作的时候,首先时能寄存器发送位,并将数据放在数据寄存器里面,串口发送完后,MCU会自动将控制寄存器里的发送位清零。
在做接收操作的时候,首先时能寄存器接收位,然后在读取数据寄存器里面的数据,MCU同样会对控制器寄存器里面接收位清零。
我感觉是在做串口收发的时候,有一个buffer,首先将数据填充,就像压子弹一样,发送一个(或者接收一个数据),再把下一个数据压到数据寄存器里面。也就是先进先出吧。
:-),理解就这么多了,不对的地方,大家请多交流交流。
void tran(unsigned char c)
{
while (!(UCSR0A&(1<<5)));------
UDR0=c;
}
贴个程序讲解更直观。
UCSR0A---控制寄存器, UDR0----数据寄存器;
1<<5---- 寄存器第5位是发送时能;
程序实现的功能就是将C 通过串口发送出去。
【 在 buchuanneiku 的大作中提到: 】
: 在网上搜索了一下 大概知道不能用serial这个来修改sbuf的值 可以通过serial window #1 来输入相应的字符 但是新问题又来了 在那个串口串口中输入 只能0-128 也就是输入的字符是按照ASCII码转换的 比如按 “a” sbuf就接收到a的ASCII码的值 或者按住alt键输入十进制的数 但是也会限制在128以内的数是正确的 一超过 比如我按住alt键输入129 sbuf接收到的数值就是乱的了 所以要输入0-128以内的数都好办 但是我希望得到一个十六进制是0xaa 的数 怎么办?
你串口数据寄存器是16位的吗?
如果不是的话,一次就不能够接收16位的数据啊。:-)
我现在下了一个keil com tool的工具可以向keil的模拟串口任意发送16位数据。
我之前描述的问题是 我的串口数据寄存器 (c51的是SBUF)是8位 通过keil仿真向串口发数据只能发十进制128以下的数据。比如我要发数值为0x18的数 我可以在串口窗口中按下ASCII码对应的为0x18的键或者按住alt键输入18 但是如果我要发送0xaa就不知道怎么发了