你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S003F3 串口多字节发送问题

[复制链接]
dozm 提问时间:2014-5-17 09:21 /
 如题,在多字节发送时有问题。测试代码如下:
#include "STM8S003F3P.h"
 
u8 RxData[10] = {0};
u8 iIndex;
_Bool flag;
_Bool flag1;
 
main()
{
//        System_Config();
        u8 i;
        Clk_Init();
        Uart1_Init(2);
        iIndex =0;
        flag = 0;
        flag1 = 0;
        _asm("rim");               // 开中断
        while (1)
        {
                if(flag1)
                {
                //        delay(8000);
                        for(i = 0;i < 10;i++)
                        {
                                UART1_SendChar(RxData);
                        }
                       
                        delay1s();
                       
                        for(i = 0;i < 10;i++)
                        {
                                UART1_SendChar(RxData);
                        }
                        flag1 = 0;
                        UART1_CR2 = 0x2c;
                }
        }
}
 
// 函数功能:UART1的接收中断服务程序
// 输入参数:无
// 输出参数:无
// 返 回 值:无
@far @interrupt void UART1_Recv_IRQHandler (void)
{
        u8 DataTemp;   // 数据缓冲
        DataTemp = UART1_DR;
        if(flag == 0)
        {
                if(DataTemp == 0x01)
                {
                        flag = 1;
                       
                        RxData[0] = DataTemp;
                        iIndex = 1;
                }
        }
        else
        {
                RxData[iIndex] = DataTemp;
                iIndex++;
                if(iIndex > 5)
                {
                        UART1_CR2 = 0x08;
                        iIndex = 0;
                        flag = 0;
                        flag1 = 1;
                }
        }
        return;
}
//以上是主函数
串口初始化:
 
void Uart1_Init(u8 UartBPS)
{       
        UART1_CR1 = 0x14;       // 9位数据,偶校验
        //UART1_CR1 = 0x00;     // 8位数据,无校验
        UART1_CR2 = 0x00;
        UART1_CR3 = 0x00;       // 編程停止位位數
       
        // 设置波特率,必须注意以下几点:
        //    (1) 必须先写BRR2
        //    (2) BRR1存放的是分频系数的第11位到第4位,
        //    (3) BRR2存放的是分频系数的第15位到第12位,和第3位
        //        到第0位
        // 例如对于波特率位9600时,分频系数=16 000 000/9600 = 208
        // 38400 时        16 000 000 / 38400 = 417
        // 对应的十六进制数为00D0,BBR1=0D,BBR2=00
        //               例  0683  68     03
        //                   01a1  1a     01
       
        UART1_BRR2 = UartBPSH[0x1a];
        UART1_BRR1 = UartBPSL[0xa0];  //2400bps
       
        //9600     16M時有誤差,24M時波特率9600無誤差
        //UART1_BRR2 = 0x03;
        //UART1_BRR1 = 0x68;
       
        //38400
        //UART1_BRR2 = 0x01;
        //UART1_BRR1 = 0x1a;
       
        UART1_CR2 = 0x2c;  // 允许接收,发送,开接收中断
       
        //UART1_CR2 = 0x28;
       
}
 
//首先不要怀疑单片机的问题,我更换过,单字节发送接收没问题。
测试:电脑向单片机发送01 02 03 04 05 06 单片机向电脑返回的也是 01 02 03 04 05 06 00 00 00 00 01 02 03 04 05 06 00 00 00 00 这个数据没问题
发送01 02 03 04 05 06 07 08 09 0a 有问题 返回 CF 02 03 04 05 06 00 00 00 00 01 02 03 04 05 06 00 00 00 00
从上面可两个for循环返回的数据可以看出,我的接收缓存RxData的数据没有问题的。我发送的字节数越长,第一个for循环电脑接收到的数据越乱,如果我在第一个for循环发送前加上延时,接收到的数据就会好很多。我怀疑是在发送的时候又进入接收中断,这样UART1_DR的值被改变了,但是我在发送之前已经在UART1_CR2中关闭了接收,为什么还出现这个情况?
 
 
 
收藏 评论9 发布时间:2014-5-17 09:21

举报

9个回答
dozm 回答时间:2014-5-17 09:22:01

回复:STM8S003F3 串口多字节发送问题

 发送的函数:
void UART1_SendChar(u8 data)
{
//        while((UART1_SR & 0x80) == 0x00);
//        UART1_DR = data;
 
        while((UART1_SR & 0x80) == 0x00);  // 若发送寄存器不空,则等待
        UART1_CR2 = 0x00;
        UART1_DR = data;                     // 将要发送的字符送到数据寄存器  
        UART1_CR2 = 0x08;
        while((UART1_SR & 0x40) ==0);//发送是否完成
}
dozm 回答时间:2014-5-17 09:31:53

RE:STM8S003F3 串口多字节发送问题

我刚才测试了一下,关闭中断以后,是不会进入接收中断程序的,这更让我想不明白了。
那片清茶 回答时间:2014-5-17 09:54:24

回复:STM8S003F3 串口多字节发送问题

回复第 3 楼 于2014-05-17 09:31:53发表:
我刚才测试了一下,关闭中断以后,是不会进入接收中断程序的,这更让我想不明白了。
 
中断关了,当然不会进接收中断了、、
 
dozm 回答时间:2014-5-17 10:06:28

回复:STM8S003F3 串口多字节发送问题

回复第 4 楼 于2014-05-17 09:54:24发表:
回复第 3 楼 于2014-05-17 09:31:53发表:
我刚才测试了一下,关闭中断以后,是不会进入接收中断程序的,这更让我想不明白了。
 
中断关了,当然不会进接收中断了、、
 求解,这是什么原因啊?

 
dozm 回答时间:2014-5-17 11:16:39

RE:STM8S003F3 串口多字节发送问题

本来是想着一帧数据不接收完就关接收中断做发送处理,但是在这款单片机上,为了数据的稳定,必须接收完再做发送处理。
什岳ing 回答时间:2015-9-7 12:46:27
你好。我的串口接收中断也进不去,你的事怎么解决的啊?求指导
jimmide 回答时间:2016-7-30 14:23:51
怎么实现的多字节发送,没看懂啊
annQian 回答时间:2018-7-20 16:30:43
dozm 发表于 2014-5-17 09:22
 发送的函数:
void UART1_SendChar(u8 data)
{

CR2 中的bit2 and bit3 在初始化时直接使能,发送和接收会有问题吗?
annQian 回答时间:2018-7-20 16:34:52
&quot 是什么意思?
if(iIndex > 5)
               {
                         UART1_CR2 = 0x08;
                         iIndex = 0;
                         flag = 0;
                         flag1 = 1;
                 }   中的 &gt是什么意思?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版