R88 发表于 2013-10-16 13:24:41

我发现串口发送数据越快,错误率越高啊。。



上面是程序,中断中不断发送,程序完全遵循正确协议

但是上位机显示不对

用示波器看波形完全没问题。起始位0-10001000-1。。而且停止位也不短。。谁能说明原因?

R88 发表于 2013-10-16 13:35:47

测量max232的电平完全没问题,正负10V很稳。。而且发现手册中背对背发送的时序有问题:


停止位之后应该在延时一个Tcy,因为手册上写到“直到前一次装入的停止位已被发送,才会向TSR 寄存器装入新数据。一旦 TXREG 寄存器向 TSR 寄存器传输了数据(在 1 个TCY内发生)”。。。

117433525 发表于 2013-10-16 13:42:10

这还用得着发现吗。理论就是这样的,
也可能是你的程序或硬件电路的问题,

yklstudent 发表于 2013-10-16 15:00:58

也许上你的串口调试工具太快了 处理不过来吧

R88 发表于 2013-10-16 15:12:50

117433525 发表于 2013-10-16 13:42 static/image/common/back.gif
这还用得着发现吗。理论就是这样的,
也可能是你的程序或硬件电路的问题, ...

硬件就单片机+max232,能有啥问题。程序楼主位就是--很短。

理论是什么样??看我示波器的波形---上位机分辨不过来么?

R88 发表于 2013-10-16 15:15:17

yklstudent 发表于 2013-10-16 15:00 static/image/common/back.gif
也许上你的串口调试工具太快了 处理不过来吧

9600不快吧。。现在把停止位时间设置长(把那五个nop换成一个延时1ms函数)一些就没问题了。。

yklstudent 发表于 2013-10-16 15:25:48

R88 发表于 2013-10-16 15:15 static/image/common/back.gif
9600不快吧。。现在把停止位时间设置长(把那五个nop换成一个延时1ms函数)一些就没问题了。。 ...

不是指通信波特率 是指两个数据间发送的间隔时间太短了 发送也时需要时间的 接收也是 太快了 串口调试助手接收估计处理不过来的

R88 发表于 2013-10-16 15:39:00

本帖最后由 R88 于 2013-10-16 15:40 编辑

yklstudent 发表于 2013-10-16 15:25 static/image/common/back.gif
不是指通信波特率 是指两个数据间发送的间隔时间太短了 发送也时需要时间的 接收也是 太快了 串口调试助 ...

按理说数据与数据的发送间隔时间可比一个数据的各个位之间的时间长。。

各个位上位机都能分辨出来。。数据也应该没问题。。那现在唯一的可能性就是上位机每接受完一个数据又干些其他事了。。我试了3个上位机都一样。。

我那个停止位足足有2个位的时间长度。。。也不短啊。。谁方便也是是看是否跟我一样。。

tragedy 发表于 2013-10-16 16:12:22

额,发送还用中断呀!
pic18的TXIF不需要软件清零么

lianghao9041 发表于 2013-10-16 16:17:05

会不会和选用的时钟晶震频率有关呢?

usingavr 发表于 2013-10-16 17:06:30

波特率有问题吧,或者是232电容不对等等……

HadesHe 发表于 2013-10-16 19:49:56

是你的程序有问题,哪有在中断里面那么多NOP的

zgxcom123 发表于 2013-10-16 21:05:10

软硬件都可能存在设计问题
包括usb转串口工具

看似简单的东西想做稳定都不容易,但是做得好了,波特率115200的几倍都没问题

HadesHe 发表于 2013-10-16 21:44:36

USB的波特律1M都可以

R88 发表于 2013-10-17 09:15:47

tragedy 发表于 2013-10-16 16:12 static/image/common/back.gif
额,发送还用中断呀!
pic18的TXIF不需要软件清零么

TXIF软件清不了,写发送寄存器的第二个指令周期就会硬件自动清零。。

R88 发表于 2013-10-17 09:19:46

HadesHe 发表于 2013-10-16 19:49 static/image/common/back.gif
是你的程序有问题,哪有在中断里面那么多NOP的

大哥一个nop刚1/8MHZ=0.12us,NOP为了延时,以免发送或者接受太快。。

tragedy 发表于 2013-10-17 09:21:57

R88 发表于 2013-10-17 09:15 static/image/common/back.gif
TXIF软件清不了,写发送寄存器的第二个指令周期就会硬件自动清零。。

你用的啥型号呀。那你是怎么进入中断的

R88 发表于 2013-10-17 09:28:00

usingavr 发表于 2013-10-16 17:06 static/image/common/back.gif
波特率有问题吧,或者是232电容不对等等……

波特率9600,每一位1000000us/9600=104us,您看示波器的波形就看出每一位差不多就是这个数。。。232正负10V电源很稳。。

波特率根据手册给的值9615,是有0.16的误差,不过这误差很小啊。。

R88 发表于 2013-10-17 09:29:43

tragedy 发表于 2013-10-17 09:21 static/image/common/back.gif
你用的啥型号呀。那你是怎么进入中断的

PIC18F2585.。。发送使能给1,如果总中断开,就会进入。。

tragedy 发表于 2013-10-17 10:42:40

你把 if(TRMT == 1)
改成 while(TRMT == 1); 等待下。
还是不要用中断发吧

R88 发表于 2013-10-17 10:47:54

tragedy 发表于 2013-10-17 10:42 static/image/common/back.gif
你把 if(TRMT == 1)
改成 while(TRMT == 1); 等待下。
还是不要用中断发吧

其实这个单片机关于串口中断挺奇怪的,中断只要开了貌似就一直得在中断函数中呆着,出不去了。。

你这样写跟我用if一样。因为如果每发送完毕,也会不断进入中断判断if。。。

R88 发表于 2013-10-17 10:52:34

tragedy 发表于 2013-10-17 10:42 static/image/common/back.gif
你把 if(TRMT == 1)
改成 while(TRMT == 1); 等待下。
还是不要用中断发吧

除非使用那个背对背的发送协议,不过这样发送太快可能容易漏发。。

HadesHe 发表于 2013-10-17 13:05:53

R88 发表于 2013-10-17 09:19 static/image/common/back.gif
大哥一个nop刚1/8MHZ=0.12us,NOP为了延时,以免发送或者接受太快。。

以免发送或者接受太快?没有你这种说法的。收发都用中断怎么会出现这种情况?

R88 发表于 2013-10-17 15:05:05

HadesHe 发表于 2013-10-17 13:05 static/image/common/back.gif
以免发送或者接受太快?没有你这种说法的。收发都用中断怎么会出现这种情况? ...

你看我mcu发送的示波器波形,是程序不对么?

看我6楼的回复,我告诉你--把nop都去了还有误码。。。

R88 发表于 2013-10-17 15:06:43

tragedy 发表于 2013-10-17 10:42 static/image/common/back.gif
你把 if(TRMT == 1)
改成 while(TRMT == 1); 等待下。
还是不要用中断发吧

你用过ccp的pwm么,,看看这个帖子:http://www.amobbs.com/thread-5554872-1-1.html

tragedy 发表于 2013-10-17 16:34:00

我看了官方论坛的回复,也不推荐Tx的中断发送
你这一上电就中断,不合适
txreg发完后 txif 为1,接着你判断 tmrt,如果tsr还在发的话,tmrt不等于1,就接着下一个发送了,不断循环就好像有问题吧。我就说说,你可以试下

asdmaill 发表于 2013-10-23 11:25:57

楼主用的PIC的哪个片子啊,我用的是DPSIC33FJ,指令时钟33177600hz,串口波特率为345600,一次发送24个字节,没任何问题的呀,可能你程序有问题吧
页: [1]
查看完整版本: 我发现串口发送数据越快,错误率越高啊。。