tianxiongweitxw 发表于 2020-11-30 10:40

STC12C5A16S2通讯问题

芯片是STC12C5A16S2,通讯波特率为115200BPS,串口中断优先级设为最高(其它的都比串口低)。现在连续接收100字节存在内存数组里。总也收不正常,是不是速度太快了,来不及处理。

ayb_ice 发表于 2020-11-30 11:01

这要看程序怎么写的,直接放队列里好些

tianxiongweitxw 发表于 2020-11-30 12:16

本帖最后由 tianxiongweitxw 于 2020-11-30 15:30 编辑

char order;
uchar i=0;
USERT RECEIVE()
{
   RI=0;
    if(i<100)             ///每次处理了串口数据,i会清一次0.
{
   order=SBUF;
    }
i++;
}

gx_huang 发表于 2020-11-30 12:41

都看不懂你的程序,如果正在处理数组,来一个串口中断咋办?如果没有保护机制不就丢数据了吗?

ayb_ice 发表于 2020-11-30 13:02

tianxiongweitxw 发表于 2020-11-30 12:16
char xdata order;
uchar i=0;
USERT RECEIVE()


如果协议是严格的一问一答这样是可以的

gx_huang 发表于 2020-11-30 14:06

order=SBUF;
这是啥意思?

tianxiongweitxw 发表于 2020-11-30 14:06

gx_huang 发表于 2020-11-30 12:41
都看不懂你的程序,如果正在处理数组,来一个串口中断咋办?如果没有保护机制不就丢数据了吗? ...

串口是同级中断啊,必须执行完串口中断函数才会响应下一个中断。

gx_huang 发表于 2020-11-30 14:17

tianxiongweitxw 发表于 2020-11-30 14:06
串口是同级中断啊,必须执行完串口中断函数才会响应下一个中断。

和串口同级中断啥意思?你处理数据的程序在哪里执行?不是主程序吗?
order=SBUF,order是数组的名称或者是首地址,这么赋值啥意思?我C语言不行,不好理解。

tianxiongweitxw 发表于 2020-11-30 14:53

本帖最后由 tianxiongweitxw 于 2020-11-30 15:41 编辑

gx_huang 发表于 2020-11-30 14:17
和串口同级中断啥意思?你处理数据的程序在哪里执行?不是主程序吗?
order=SBUF,order是数组的名称或者 ...
order{I}

coody 发表于 2020-11-30 14:58

STC12C5A16S2我用过最快460800都没问题。这么MCU是快速51内核,115200波特率,也是86.8us中断一次(一位停止位,10位一个字节),对于这个MCU来说,速度不快,跑22.1184MHz,轻松支持双串口。

oufuqiang 发表于 2020-12-1 13:41

11.0592MHz的时候,跑230400bps,全双工,满带宽持续接收数据流还带分析,并驱动DS18B20,全部正常。
https://bbs.21ic.com/icview-2867776-1-1.html

QuakeGod 发表于 2020-12-1 18:18

你那个大写和小写混合在一起用是怎么回事?
C语言是严格区分大小写的。

圣骑士by 发表于 2020-12-2 09:02

速度调低试试。
看看晶振是不是不对?

ks11900 发表于 2020-12-2 09:12

还是有dma好。。。

qinlu123 发表于 2020-12-2 11:57

本帖最后由 qinlu123 于 2020-12-2 14:29 编辑

是偶尔收错还是固定位置收错,开启中断嵌套了吗

tianxiongweitxw 发表于 2020-12-2 16:41

今天在中断里面加个变量,看到底有没有进入中断。

tianxiongweitxw 发表于 2020-12-2 19:42

char order;
uchar i=0;
USERT RECEIVE()
{
      RI=0;
    if(i<100)             ///每次处理了串口数据,i会清一次0.
{
    order=SBUF;
   }
i=i++;   //这里改成i++,程序就正常了,太奇怪了,不就多几个US的执行时间
}

i=i++;   //这里改成i++,程序就正常了,太奇怪了,不就多几个US的执行时间

tianxiongweitxw 发表于 2020-12-2 19:47

tianxiongweitxw 发表于 2020-12-2 19:42
char order;
uchar i=0;
USERT RECEIVE()


I=I++与 I=I+1,完成不同,I每次都清了0 ,所以程序就不正常了。

谭翬 发表于 2020-12-4 09:04

本帖最后由 谭翬 于 2020-12-4 09:09 编辑

uchar order;//无符号数组,100个字节
uchar i=0;          //i的最大值99
USERT RECEIVE()
{
   RI=0;
   order=SBUF;
   i++;
    if(i>99){i=0;}//接收缓存区长度不能超过100
}
页: [1]
查看完整版本: STC12C5A16S2通讯问题