打印

STC12C5A16S2通讯问题

[复制链接]
741|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianxiongweitxw|  楼主 | 2020-11-30 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2020-11-30 11:01 | 只看该作者
这要看程序怎么写的,直接放队列里好些

使用特权

评论回复
评论
xyz549040622 2020-12-3 19:17 回复TA
@tianxiongweitxw :数组其实就是队列的。 
tianxiongweitxw 2020-11-30 12:10 回复TA
放数组里和队列里有什么区别啊? 
板凳
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 | 只看该作者
都看不懂你的程序,如果正在处理数组,来一个串口中断咋办?如果没有保护机制不就丢数据了吗?

使用特权

评论回复
评论
gx_huang 2020-11-30 14:05 回复TA
@tianxiongweitxw : order=SBUF;是啥意思?我都看不懂 
tianxiongweitxw 2020-11-30 14:03 回复TA
关键是一个数据都不对,奇了怪了 
5
ayb_ice| | 2020-11-30 13:02 | 只看该作者
tianxiongweitxw 发表于 2020-11-30 12:16
char xdata order[100];
uchar i=0;
USERT RECEIVE()

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

使用特权

评论回复
6
gx_huang| | 2020-11-30 14:06 | 只看该作者
order=SBUF;
这是啥意思?

使用特权

评论回复
7
tianxiongweitxw|  楼主 | 2020-11-30 14:06 | 只看该作者
gx_huang 发表于 2020-11-30 12:41
都看不懂你的程序,如果正在处理数组,来一个串口中断咋办?如果没有保护机制不就丢数据了吗? ...

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

使用特权

评论回复
8
gx_huang| | 2020-11-30 14:17 | 只看该作者
tianxiongweitxw 发表于 2020-11-30 14:06
串口是同级中断啊,必须执行完串口中断函数才会响应下一个中断。

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

使用特权

评论回复
9
tianxiongweitxw|  楼主 | 2020-11-30 14:53 | 只看该作者
本帖最后由 tianxiongweitxw 于 2020-11-30 15:41 编辑
gx_huang 发表于 2020-11-30 14:17
和串口同级中断啥意思?你处理数据的程序在哪里执行?不是主程序吗?
order=SBUF,order是数组的名称或者 ...

order{I}

使用特权

评论回复
10
coody| | 2020-11-30 14:58 | 只看该作者
STC12C5A16S2我用过最快460800都没问题。这么MCU是快速51内核,115200波特率,也是86.8us中断一次(一位停止位,10位一个字节),对于这个MCU来说,速度不快,跑22.1184MHz,轻松支持双串口。

使用特权

评论回复
11
oufuqiang| | 2020-12-1 13:41 | 只看该作者
11.0592MHz的时候,跑230400bps,全双工,满带宽持续接收数据流还带分析,并驱动DS18B20,全部正常。
https://bbs.21ic.com/icview-2867776-1-1.html

使用特权

评论回复
12
QuakeGod| | 2020-12-1 18:18 | 只看该作者
你那个大写和小写混合在一起用是怎么回事?
C语言是严格区分大小写的。

使用特权

评论回复
13
圣骑士by| | 2020-12-2 09:02 | 只看该作者
速度调低试试。
看看晶振是不是不对?

使用特权

评论回复
14
ks11900| | 2020-12-2 09:12 | 只看该作者
还是有dma好。。。

使用特权

评论回复
15
qinlu123| | 2020-12-2 11:57 | 只看该作者
本帖最后由 qinlu123 于 2020-12-2 14:29 编辑

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

使用特权

评论回复
16
tianxiongweitxw|  楼主 | 2020-12-2 16:41 | 只看该作者
今天在中断里面加个变量,看到底有没有进入中断。

使用特权

评论回复
17
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的执行时间

使用特权

评论回复
评论
xyz549040622 2020-12-3 19:20 回复TA
你3楼的程序是正常的i++没问题,i=i++;就有问题了。 
18
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 ,所以程序就不正常了。

使用特权

评论回复
19
谭翬| | 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
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

520

帖子

0

粉丝