打印
[STC单片机]

STC8A 2位停止位求助

[复制链接]
1316|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大虾:通讯仪器协议为8位数据位,1位偶校验,2位停止位,波特率600,用电脑串口用1.5停止位、2停止位跟仪器通讯能成功,1停止位通讯失败;用STC8A向电脑串口发送也能正确接收,但用STC8A跟仪器通讯就没反应,是不是软件模拟2停止位不对?请各位大神指点,程序如下

串口发送数据程序:
void SendDataByUart1(u8 dat)
{
    ACC=dat;          //增加偶校验,是否正确?
        TB8=P;                 //        增加偶校验,是否正确?

       
       
        SBUF = dat;                 //写数据到UART数据寄存器
        _nop_();
        while(TI == 0);             //在停止位没有发送时,TI为0即一直等待
        delay_ms(1);               //模拟2位停止位?是否正确
        TI = 0;                     //清除TI位(该位必须软件清零)
       
        _nop_();
}


串口初始化程序
void Uart1_Init(void)
{               
        PCON &= 0x3f;                //波特率不倍速,串行口工作方式由SM0、SM1决定
        SCON = 0xd0;                //9位数据,可变波特率,启动串行接收器
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xfe;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0f;                //清除定时器1模式位
        TL1 = 0x00;                  //设定定时初值
        TH1 = 0xee;                  //设定定时器重装值
        ET1 = 0;                    //禁止定时器1中断
        TR1 = 1;                    //启动定时器1
        ES = 1;                                       // 串口1中断打开
        EA = 1;                                       // 总中断打开
}

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2019-7-26 13:52 | 只看该作者
这样是不好的,首先这个延时程序是受它中断影响的,再说根据波特率600,延时应该是1000/600=1.67ms,你这时间也不对

硬件不支持2位停止位,就不要用,直接1个停止位就可以了

使用特权

评论回复
板凳
gx_huang| | 2019-7-26 15:32 | 只看该作者
先理解数据位和停止位的含义。
数据位,可以包含奇偶校验位,可以是0也可以是1。
停止位,必须是1,如果8位数据+奇偶校验,其实就是9位数据了。
51芯片不支持1+8+校验+2停止位,但是可以支持1+8+2,把奇偶校验一直写1就是2个停止位。
如果要实现1+8+校验+2,软件延时也可以,但是只能处理发送,接收不行。
600bps,延时1ms也不够的。

使用特权

评论回复
地板
2003070203|  楼主 | 2019-7-26 23:02 | 只看该作者
ayb_ice 发表于 2019-7-26 13:52
这样是不好的,首先这个延时程序是受它中断影响的,再说根据波特率600,延时应该是1000/600=1.67ms,你这时 ...

因为接收仪器必须是2停止位没办法更改,明天把延时加长试下看

使用特权

评论回复
5
2003070203|  楼主 | 2019-7-26 23:05 | 只看该作者
gx_huang 发表于 2019-7-26 15:32
先理解数据位和停止位的含义。
数据位,可以包含奇偶校验位,可以是0也可以是1。
停止位,必须是1,如果8位 ...

多谢指导,接收仪器规则是偶校验+2停止位,我明天试下把校验位写1、加长延时都试下看。

使用特权

评论回复
6
2003070203|  楼主 | 2019-7-27 23:01 | 只看该作者
延时加长了还是不行,有没可能是波特率设置不够精确呢?16位的不会算波特率,我附件的笨方法写的。

波特率生成.JPG (108.14 KB )

波特率生成.JPG

使用特权

评论回复
7
gx_huang| | 2019-7-29 08:25 | 只看该作者
2003070203 发表于 2019-7-27 23:01
延时加长了还是不行,有没可能是波特率设置不够精确呢?16位的不会算波特率,我附件的笨方法写的。 ...

如果是1T的MCU,串口时钟没有12分频,则8bit的不够,如果是16bit的,你的数据似乎也不对。

使用特权

评论回复
8
2003070203|  楼主 | 2019-8-5 22:43 | 只看该作者
gx_huang 发表于 2019-7-29 08:25
如果是1T的MCU,串口时钟没有12分频,则8bit的不够,如果是16bit的,你的数据似乎也不对。 ...

能帮忙指出具体哪里不对,应该怎么改吗?目前程序写的是1TMCU没分频。

波特率生成1.JPG (112.86 KB )

波特率生成1.JPG

使用特权

评论回复
9
gx_huang| | 2019-8-6 09:26 | 只看该作者
2003070203 发表于 2019-8-5 22:43
能帮忙指出具体哪里不对,应该怎么改吗?目前程序写的是1TMCU没分频。

AUXR|=0X40不是T1选1T时钟,而是T0选1T时钟。
波特率,很简单的事情,最好自己看数据手册,最好示波器测试一下波形。

使用特权

评论回复
10
2003070203|  楼主 | 2019-8-6 22:18 | 只看该作者
gx_huang 发表于 2019-8-6 09:26
AUXR|=0X40不是T1选1T时钟,而是T0选1T时钟。
波特率,很简单的事情,最好自己看数据手册,最好示波器测 ...

AUXR|=0X40不是T1选1T时钟?   我查了手册如下,应该没错吧?
波特率我按手册算了,初值也没ee00也没错。

波特率.JPG (103.12 KB )

波特率

波特率

AUXR.JPG (152.22 KB )

AUXR

AUXR

使用特权

评论回复
11
gx_huang| | 2019-8-7 08:56 | 只看该作者
2003070203 发表于 2019-8-6 22:18
AUXR|=0X40不是T1选1T时钟?   我查了手册如下,应该没错吧?
波特率我按手册算了,初值也没ee00也没错。
...

哦,是我看错一位了,这个数据手册,和别人不太一样,把地址作为d7了。
看你的贴图,波特率似乎是对的,也就是你的贴图的思路,误导了我和你自己。
你的串口模式似乎错了,SCON=0XD0,是模式2,是固定波特率,模式3才是可调波特率。

使用特权

评论回复
12
2003070203|  楼主 | 2019-8-7 23:20 | 只看该作者
gx_huang 发表于 2019-8-7 08:56
哦,是我看错一位了,这个数据手册,和别人不太一样,把地址作为d7了。
看你的贴图,波特率似乎是对的, ...

模式没错啊,SM0/SM1均为1

模式.JPG (182.26 KB )

模式.JPG

使用特权

评论回复
13
gx_huang| | 2019-8-8 08:43 | 只看该作者
2003070203 发表于 2019-8-7 23:20
模式没错啊,SM0/SM1均为1

哦,模式对的,眼神不好,看出SM1/2了。
仔细看了你的第一个帖子的说明,STC8A发送,PC可以接收,你还怀疑啥波特率呢?波特率肯定对的呀。
不要一棵树吊死,检查一下硬件,示波器看看波形。
或者用PC监控一下STC8A和仪器的串口发送数据。

使用特权

评论回复
14
2003070203|  楼主 | 2019-8-15 21:16 | 只看该作者
gx_huang 发表于 2019-8-8 08:43
哦,模式对的,眼神不好,看出SM1/2了。
仔细看了你的第一个帖子的说明,STC8A发送,PC可以接收,你还怀 ...

用示波器看了波形,偶校验位数据不对;同时用程序把P值显示出来,确实P值对不上,请教下是什么原因?

使用特权

评论回复
15
2003070203|  楼主 | 2019-8-15 23:10 | 只看该作者
尝试发送0xaa,0x01,0x00,0x55,波形如下

波形测试.png (58.25 KB )

波形测试.png

使用特权

评论回复
16
gx_huang| | 2019-8-16 09:35 | 只看该作者
2003070203 发表于 2019-8-15 21:16
用示波器看了波形,偶校验位数据不对;同时用程序把P值显示出来,确实P值对不上,请教下是什么原因? ...

P=0表示ACC中值为1的数量是偶数
P=1表示ACC中值为1的数量是奇数
你的程序没有错,波形比较难以判断起始位,最好中间间隔一段时间便于看波形。
0x11,0x00,0x55,校验位应该都是0才对,看波形似乎都是0。

使用特权

评论回复
17
2003070203|  楼主 | 2019-8-16 21:01 | 只看该作者
gx_huang 发表于 2019-8-16 09:35
P=0表示ACC中值为1的数量是偶数
P=1表示ACC中值为1的数量是奇数
你的程序没有错,波形比较难以判断起始位 ...

神奇了,我把程序改了下,TB8赋值2次,波形居然对了,通信也成功了,似乎是TB8赋值问题,单独在SBUF前或者后给TB8赋值都不行,必须赋值2次才可以,是什么问题呢?
另外,通信结果不稳定,有时候行有时候不行,是否哪里还有缺陷?


TB8=P;                 //        增加偶校验,是否正确?      
SBUF = dat;                 //写数据到UART数据寄存器
TB8=P;                 //        增加一次TB8赋值

使用特权

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

本版积分规则

4

主题

16

帖子

0

粉丝