STC12C5A16S2通讯问题

[复制链接]
1239|23
 楼主| tianxiongweitxw 发表于 2020-11-30 10:40 | 显示全部楼层 |阅读模式
芯片是STC12C5A16S2,通讯波特率为115200BPS,串口中断优先级设为最高(其它的都比串口低)。现在连续接收100字节存在内存数组里。  总也收不正常,是不是速度太快了,来不及处理。
ayb_ice 发表于 2020-11-30 11:01 | 显示全部楼层
这要看程序怎么写的,直接放队列里好些

评论

@tianxiongweitxw :数组其实就是队列的。  发表于 2020-12-3 19:17
放数组里和队列里有什么区别啊?  发表于 2020-11-30 12:10
 楼主| tianxiongweitxw 发表于 2020-11-30 12:16 | 显示全部楼层
本帖最后由 tianxiongweitxw 于 2020-11-30 15:30 编辑

char order[100];
uchar i=0;
USERT RECEIVE()
{
     RI=0;
    if(i<100)             ///每次处理了串口数据,i会清一次0.
{
   order[I]=SBUF;
    }
i++;
}
gx_huang 发表于 2020-11-30 12:41 | 显示全部楼层
都看不懂你的程序,如果正在处理数组,来一个串口中断咋办?如果没有保护机制不就丢数据了吗?

评论

@tianxiongweitxw : order=SBUF;是啥意思?我都看不懂  发表于 2020-11-30 14:05
关键是一个数据都不对,奇了怪了  发表于 2020-11-30 14:03
ayb_ice 发表于 2020-11-30 13:02 | 显示全部楼层
tianxiongweitxw 发表于 2020-11-30 12:16
char xdata order[100];
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[100];
uchar i=0;
USERT RECEIVE()
{
      RI=0;
    if(i<100)             ///每次处理了串口数据,i会清一次0.
{
    order[I]=SBUF;
     }
i=i++;   //这里改成i++,程序就正常了,太奇怪了,不就多几个US的执行时间
}

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

评论

你3楼的程序是正常的i++没问题,i=i++;就有问题了。  发表于 2020-12-3 19:20
 楼主| tianxiongweitxw 发表于 2020-12-2 19:47 | 显示全部楼层
tianxiongweitxw 发表于 2020-12-2 19:42
char order[100];
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];//无符号数组,100个字节
uchar i=0;          //i的最大值99
USERT RECEIVE()
{
     RI=0;
     order=SBUF;
     i++;
    if(i>99){i=0;}//接收缓存区长度不能超过100
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

521

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部