打印

单片机与上位机通信不同步问题

[复制链接]
2886|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大侠好,我在用单片机给PC通信的时候出了点小问题,用单片机发送的16进制数据,在串口调试工具上总是显示的不正确,我研究了一下,在单片机中设定SCON=0X50,既工作在方式1时,它是十位异步通讯,就是8个数据位,一个起始位,一个停止位,但是在串口调试助手中,没有起始位的设置,只有停止位,所以电脑实际上只接收了9位就不再接收了,而且把第一位的起始位当成了数据,而把最后一个数据位当成了停止位,怎么解决这个窜位错误,让它正确显示呢?

相关帖子

沙发
followme001| | 2013-5-2 09:45 | 只看该作者
LZ的理解不对吧。。串口助手里不用设置起始位。

使用特权

评论回复
板凳
miaodonglin|  楼主 | 2013-5-2 10:19 | 只看该作者
followme001 发表于 2013-5-2 09:45
LZ的理解不对吧。。串口助手里不用设置起始位。

但是我单片机发送了一个起始位,串口通信似乎把这个起始位当做数据了

使用特权

评论回复
地板
yklstudent| | 2013-5-2 10:38 | 只看该作者
呵呵

使用特权

评论回复
5
miaodonglin|  楼主 | 2013-5-2 11:06 | 只看该作者
followme001 发表于 2013-5-2 09:45
LZ的理解不对吧。。串口助手里不用设置起始位。

不好意思是我理解错了,串口助手并没有把起始位当数据位,只不过它在传输数据中二进制顺序是完全相反的,这个怎么解决啊?

使用特权

评论回复
6
miaodonglin|  楼主 | 2013-5-2 11:07 | 只看该作者
yklstudent 发表于 2013-5-2 10:38
呵呵

大神,别呵呵啊,帮帮忙呗

使用特权

评论回复
7
ayb_ice| | 2013-5-2 11:07 | 只看该作者
不懂就不要乱下结论

不可能没有启始位的,启始是固定的,占一位,停止位可以占一位或多位的

使用特权

评论回复
8
miaodonglin|  楼主 | 2013-5-2 11:15 | 只看该作者
ayb_ice 发表于 2013-5-2 11:07
不懂就不要乱下结论

不可能没有启始位的,启始是固定的,占一位,停止位可以占一位或多位的 ...

现在明白了,只是在接收的时候接收的二进制的顺序完全是反过来的,这样就没办**确显示读取的数据了,这咋办啊

使用特权

评论回复
9
ayb_ice| | 2013-5-2 11:39 | 只看该作者
你的问题其实是大小端的问题
这个在通信时当然是要预先考虑的,其实就是先发送高字节,还是先发送低字节的问题

使用特权

评论回复
10
miaodonglin|  楼主 | 2013-5-2 16:51 | 只看该作者
ayb_ice 发表于 2013-5-2 11:39
你的问题其实是大小端的问题
这个在通信时当然是要预先考虑的,其实就是先发送高字节,还是先发送低字节的问 ...

就是一个sbuf缓存器,如何控制它先发送什么呢?

使用特权

评论回复
11
ayb_ice| | 2013-5-2 16:58 | 只看该作者
不可能的,又换成了低位在前,高位在前的问题了

UART一般都是先发送低位的,至少必须兼容这种模式

使用特权

评论回复
12
miaodonglin|  楼主 | 2013-5-2 17:43 | 只看该作者
本帖最后由 miaodonglin 于 2013-5-2 17:57 编辑
ayb_ice 发表于 2013-5-2 16:58
不可能的,又换成了低位在前,高位在前的问题了

UART一般都是先发送低位的,至少必须兼容这种模式 ...

你看,比如,我把sbuf=0x04, 然后我发送(既发送的是0000 0100),在串行通信助手里显示的就是DF,也就是1101 1111 ,可以看到,是取反后,还是逆序读取的,这让人很郁闷啊,书上写的发送程序不会出现这种情况啊


附上程序

#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
void es0(void) interrupt 4 using 1                  
{
//int A;
//A=0x01;
SBUF=0x04;
TI=0;
}
void main(void)
{
SCON=0x50;
TMOD=0x21;       
TH1=0xE8;
TL1=0xE8;
PCON=0x00;
TR1=1;
ES=1;                                               
EA=1;
TI=1;
while(1)
{;}
}

使用特权

评论回复
13
ayb_ice| | 2013-5-2 18:45 | 只看该作者
自己用示波器看看嘛
换个超级终端看看嘛

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
miaodonglin + 1 赞一个!
14
海川先生| | 2013-5-2 20:21 | 只看该作者
04呀,用的是你的代码。

360截图20130502202157609.jpg (79.88 KB )

360截图20130502202157609.jpg

使用特权

评论回复
15
miaodonglin|  楼主 | 2013-5-3 08:10 | 只看该作者
本帖最后由 miaodonglin 于 2013-5-3 08:20 编辑
海川先生 发表于 2013-5-2 20:21
04呀,用的是你的代码。

那是我连线错了,请问您是怎么连的线。我就是把单片机的P3.1直接连到了9针串口的2号针上,还有单片机的GND连到了5针上,是不是还需要连接别的什么的??(还有,我用的是笔记本电脑,所以用了USB转RS232接口,是不是跟这个也有关系,难道非得用台式机吗?)

使用特权

评论回复
16
miaodonglin|  楼主 | 2013-5-3 08:46 | 只看该作者
ayb_ice 发表于 2013-5-2 18:45
自己用示波器看看嘛
换个超级终端看看嘛

OK,谢谢啦,已经弄好了,我加了一个MAX232 就OK了

使用特权

评论回复
17
原野之狼| | 2013-5-3 09:08 | 只看该作者
这个问题  拿示波器抓一下波形就八*#九不离十了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝