打印

关于串口的一个奇怪问题,求大神帮忙解析下

[复制链接]
4576|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hundgpw|  楼主 | 2013-1-9 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机通过串口,依次发送10单字节数据(0x1~0x10)给PC,中间使用MAX3232作电平转换,PC端使用串口调试助手接收,串口设置为速率9600,1位起始位,1位停止位,无奇偶校验,结果PC端收到的据却总为0xFE或0xFF。
使用示波器观察TTL电平可以截取到3.3V的波形,可以读到起始位、数据位、停止位,其中数据位可以读出0x1~0x10的数据,即数据已经发送出去且正确。
用示波器继续观察转换过的11V左右的232电平,使用反逻辑也可以读到正确的起始位、数据位、停止位。

这个表明单片机已经将数据正确发送了出去,且经MAX3232转换的直接发给PC的232电平也为正确,但是使用PC上的串口调试助手接收到的数据为什么总是不正确呢?(另使用BUSHOUD在PC上抓COM上的数据包,与串口调试助手显示的数据一致)

感觉问题很奇怪,还请大神帮忙解析下,不甚感激!

相关帖子

沙发
tergy2012| | 2013-1-9 16:01 | 只看该作者
不懂这个问题,我是来支持一下lz的

使用特权

评论回复
板凳
hundgpw|  楼主 | 2013-1-9 16:06 | 只看该作者
谢谢tergy2012!

使用特权

评论回复
地板
zh5202| | 2013-1-9 16:20 | 只看该作者
这个问题,之前也遇到过。
不过是串口调试助手的问题,总是显示不正确的数据。
不过楼主的情况好像不是串口调试工具的问题。
建议如下做:
    首先另外再用一个串口工具抓包看数据是否还是不对,若还是不对,则做一下两步:
    仔细分析程序,看看程序具体发出来的数据是多少,串口真配置为1起始位、1停止位、无校验位么?且数据位是多少位?
    用示波器测试发出的数据和CLK,确定发出来的数据是什么,时钟线是否正常,时钟是不是9600?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hundgpw + 1
5
2389676302| | 2013-1-9 16:21 | 只看该作者
这个问题太深奥了

使用特权

评论回复
6
hundgpw|  楼主 | 2013-1-9 16:31 | 只看该作者
zh5202 发表于 2013-1-9 16:20
这个问题,之前也遇到过。
不过是串口调试助手的问题,总是显示不正确的数据。
不过楼主的情况好像不是串口 ...

非常感谢!
1、串口调试助手总共用了两款,接收到的数据一致,即均不正确;
2、用BUSHOUND抓包串口数据,与串口调试助手的显示结果是一样的;
3、程序里是直接给一个buf赋值10个数据0x1~0x10,通过for循环将10个数据发送出去,配置是按照1起始位、1停止位、无校验位。
4、数据传输是使用了三根线:TX、RX、GND,没使用到CLK啊,用示波器可以观察到单片机TX线上的TTL电平和232电平的起始位、数据位、停止位,其中一个bit的宽度是100us,算一下,速率刚好是10K,与9600基本一致

就是找不到问题所在啊。

使用特权

评论回复
7
zh5202| | 2013-1-9 16:35 | 只看该作者
你设置的串口数据位数是多少?
如果也正确,那我也还真么有遇到过LZ的情况呀

使用特权

评论回复
8
hundgpw|  楼主 | 2013-1-9 16:38 | 只看该作者
zh5202 发表于 2013-1-9 16:35
你设置的串口数据位数是多少?
如果也正确,那我也还真么有遇到过LZ的情况呀 ...

数据位是8位啊,可是发送0x1~0x10,能收到0xFF、0xFE真的感觉很奇怪,波特率用示波器可以截到bit宽是100us,波特率是9600也没错啊,真心不懂啊!

使用特权

评论回复
9
shenyudong| | 2013-1-9 17:00 | 只看该作者
这实验我做过,我也遇到过问题,我是程序的问题,调试了2次ok了,你可以再看看程序体,和相关设置,祝早日解决,哈:D

使用特权

评论回复
10
jlass| | 2013-1-9 17:10 | 只看该作者
串口调试助手使用CTS和RTS分开可选的那种,不要用CTS/RTS的这种。
可以排除一下是不是受到CTS与RTS的影响了

使用特权

评论回复
11
hundgpw|  楼主 | 2013-1-9 17:14 | 只看该作者
jlass 发表于 2013-1-9 17:10
串口调试助手使用CTS和RTS分开可选的那种,不要用CTS/RTS的这种。
可以排除一下是不是受到CTS与RTS的影响了 ...

串口调试助手上的CTS和RTS均没有勾选啊,传输也只使用了三线。

使用特权

评论回复
12
hundgpw|  楼主 | 2013-1-9 17:16 | 只看该作者
shenyudong 发表于 2013-1-9 17:00
这实验我做过,我也遇到过问题,我是程序的问题,调试了2次ok了,你可以再看看程序体,和相关设置,祝早日 ...

可是我这个已经在单片机的TX脚上捕获了正确的数据了,而且和程序中写入buf的数据时一致的,正是纠结所在啊,问题不知从何找起:'(

使用特权

评论回复
13
zd420325| | 2013-1-9 17:34 | 只看该作者
通过MAX232,把接收和发送短接,然后在你的系统板上通过LED或者其它显示方式验证下发送和接收的是不是一样,判断是否软件的问题。同样的方式验证你的上位机软件和数据转换模块(USB转串口或者其它)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hundgpw + 1
14
oldda| | 2013-1-9 17:35 | 只看该作者
从PC机发送一个数据0x55或者OxAA给单片机,单片机可以将接收的数据变换为相应的管脚状态,看看情况?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hundgpw + 1 很给力!
15
hundgpw|  楼主 | 2013-1-9 17:50 | 只看该作者
zd420325 发表于 2013-1-9 17:34
通过MAX232,把接收和发送短接,然后在你的系统板上通过LED或者其它显示方式验证下发送和接收的是不是一样 ...

单片机的串口是半双工的没办法自发自收,PC上自发自收试了一下,没有错误。

使用特权

评论回复
16
hundgpw|  楼主 | 2013-1-9 17:56 | 只看该作者
本帖最后由 hundgpw 于 2013-1-9 17:58 编辑
oldda 发表于 2013-1-9 17:35
从PC机发送一个数据0x55或者OxAA给单片机,单片机可以将接收的数据变换为相应的管脚状态,看看情况? ...

真是太感谢了,问题已经解决了,但是又有了一个新的问题。

受您启发,我在PC上用9600的速率下发0x55,使用示波器看了一下,发现一个bit的宽度居然为500us,这说明了PC的9600速率和实际的9600速率不匹配,于是我将单片机的速率降低了5倍,即使用1920的速率,然后PC上的串口调试助手可以接收到正确的数据了。

问题是为什么PC上设置9600的速率,下发的实际速率却是500us的位宽呢,即2000的速率呢?

为什么PC上设置的速率和PC实际输出的速率不一致呢?还是求大神解释啊!

使用特权

评论回复
17
gx_huang| | 2013-1-9 20:15 | 只看该作者
换一台PC,PC还从来没有发现波特率有错误的。

使用特权

评论回复
18
qq1959837802| | 2013-1-9 22:00 | 只看该作者
不太清楚,帮顶了

使用特权

评论回复
19
chunyang| | 2013-1-10 00:16 | 只看该作者
要么是波特率设置/晶体频率选择的问题,要么是编程有误。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hundgpw + 1 赞一个!
20
visionliweixin| | 2013-1-10 07:27 | 只看该作者
设9600,每位是500us真的还没遇到过,试试别的波特率或换个串口软件再试试,我常用的是sscom

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hundgpw + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

76

帖子

1

粉丝