N76E003串口115200接收连续数据不完整怎么解决?
本帖最后由 zhcj66 于 2018-6-23 11:13 编辑如题"N76E003串口波特率115200,接收连续数据不完整怎么解决?",
原先用的STM8S103可以一次接收10bit数据,不丢数据,然而因为涨价严重,不的不换方案
这些8bit的mcu也没有DMA真的接收数据很累啊,GD和ST的32bit的mcu电压都是最高3.3v的也没有个5v的,如果换这样的mcu还需要加LDO成本又上去了
难道N76E003芯片串口接收连续数据是,只能在发送每个字节上加延时了吗? 新唐的东东真难用啊,N76E003不是Keil官方支持的芯片,装了驱动接仿真器之后一通乱跑,调试都没头绪了啊,也不知道是Nulink的问题还是windows10兼容性的问题!
后面还有人在跟着催进度,伤不起啊! coleyao 发表于 2018-6-23 09:34
新唐的东东真难用啊,N76E003不是Keil官方支持的芯片,装了驱动接仿真器之后一通乱跑,调试都没头绪了啊 ...
乱跑倒是还没有遇到,刚刚测试,串口打断点,发送一个数据,半天才中断,有点伤不起.
不知道这种8bit的mcu 除了发送数据中间加延时 还有什么好的办法没>? 我不知道你们为啥那么多问题,我几乎没啥问题,串口什么得,都妥妥得。。。多看看手册,按照官方资料来配置,一般情况都没事情!!!当然了要说没事情,也不对,就遇到了keil编译器对于C51个人优化后NC得算法,不太遵守C标准。。。其他得,目前没啥大问题,包括捕捉,adc等等!!! OneRain 发表于 2018-6-23 10:42
我不知道你们为啥那么多问题,我几乎没啥问题,串口什么得,都妥妥得。。。多看看手册,按照官方资料来配置 ...
串口115200速率 接收多个数据 中间不加延时 不丢数据? 参考以前51的接收方案,在中断里面接收到缓存 LearningASM 发表于 2018-6-23 11:40
参考以前51的接收方案,在中断里面接收到缓存
已经加了缓冲的,还会出现丢数据问题,所以才上来问问,有没有更好的办法的
void UART0_INT(void) interrupt 4
{
if (RI==1)
{ /* if reception occur */
clr_RI; /* clear reception flag for next reception */
buf = SBUF;
kpp++;
}
} 115200 这个得把N76E003 内部时钟修正了16.6M,手册UART里有说明的
手册131页内容
但在大部分的应用中波特率115200是最常用的数值,所以我们提供调整HIRC到16.6MHz的方法,用来产生较为准确的波特率。下列表格列出,当HIIRC为16.6 MHz 时,产生波特率数值及误差。
这类便宜的东西,多看看手册还是比较好的哈 76e003bug 还是有的, 要便宜,就要多动脑了。
目前也在跳坑中ing rei1984 发表于 2018-6-23 14:22
76e003bug 还是有的, 要便宜,就要多动脑了。
目前也在跳坑中ing
楼上的 掉入哪个坑了? 楼主可以试试先接收后clr_ri 这个芯片还是挺好用的,自从ST的003涨价后,公司产品都转成了新唐的 eaglelpx 发表于 2018-6-23 14:42
楼主可以试试先接收后clr_ri
我是先接收一定数据,接收完成,单独在发送接收完成的数据,目的为了不上发送影响接收,可是还是不行啊, superAFE 发表于 2018-6-23 15:01
dma的功能已经深入人心了,现在国产的mcu一般都是没有这功能,换国产的mcu只能将就点了。 ...
不知道GD的芯片稳定性咋样 superAFE 发表于 2018-6-23 15:11
gd的芯片用得好应该行,我跑过不过客户,三四年前就用它来代替st的了。现在中低端的mcu用国产的代替进口 ...
st坑了 ,害了不少电工门 就一个串口还用得着DMA modbus 发表于 2018-6-23 15:55
就一个串口还用得着DMA
当然不需要,用过这么多mcu的串口,都没有问题 第一次用E003 不知道是什么原因造成的 楼主问题解决了吗?你的原因应该是计算波特率的时候多加了一个1导致的。试试这样:
#ifdef FOSC_166000 // if Fsys = 16.6MHz
RH3 = HIBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */
RL3 = LOBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */
#endif anjiyifan 发表于 2019-5-30 23:43
楼主问题解决了吗?你的原因应该是计算波特率的时候多加了一个1导致的。试试这样:
#ifdef FOSC_166000 //...
已经放弃这个芯片了 zhcj66 发表于 2019-5-31 13:22
已经放弃这个芯片了
我猜你之前是波特率计算出错了,官方例程的计算方法有误的,多加了一个1,在9600波特率下,偏差1没影响,但是115200波特率下,波特率计数器设置值很小,相差一个1,就占很大百分比了。
还是得看芯片手册上的计算方法才行,芯片手册上的是对的。 当然也有可能是中断优先级问题。高波特率下要把串口中断优先级设高一点,不然被别的中断抢占后,容易丢数据。 anjiyifan 发表于 2019-5-30 23:43
楼主问题解决了吗?你的原因应该是计算波特率的时候多加了一个1导致的。试试这样:
#ifdef FOSC_166000 //...
这个观点 很新颖 把波特率降低点可能会好些
页:
[1]