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

STM32串口接收问题

[复制链接]
weihongshuo 提问时间:2020-4-18 23:22 /
毕业设计需要用到STM32串口通讯部分,我根据例子写出了一个STM32串口通讯的小程序,目标是发送0xcc,0xdd,1,2,3,4,5,6,0xee这样的数据给到STM32中,其中0xcc和0xdd是帧头,0xee是帧尾,目前问题为用串口助手XCOM一次性发送这九个数据时,STM32只能收到两个数据,即0xcc和0xdd。用串口助手单个数据一个一个发送发送经过测试没有问题,请问我该调整哪个部分?
代码如下,


void USART1_IRQHandler(void)   
{  
    extern unsigned char openmv[];
  unsigned char temp;
    if( USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET )
    {
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        temp = USART_ReceiveData(USART1);
        Openmv_Receive_Data(temp);//解包函数
    }
}

void Openmv_Receive_Data(unsigned char data)//发送数据0xCC,0xDD,x,y,z,a,b,c,0XEE
{
    extern unsigned char openmv[9];
    static char state = 0;   
  static char bit_number=0;   
    if(state==0&&data==0xCC)
    {
        state=1;
        openmv[bit_number++]=data;
    }
    else if(state==1&&data==0xDD)
    {
        state=2;
        openmv[bit_number++]=data;
    }
    else if(state==2)
    {
        openmv[bit_number++]=data;
        if(bit_number>=8)
        {
            state=3;
        }
    }
    else if(state==3)
    {
            if(data == 0xEE)
            {
                    state = 0;
                    openmv[bit_number++]=data;
                            bit_number = 0;
            }
            else if(data != 0xEE)
            {
                    state = 0;
                           bit_number = 0;
                    for(int i=0;i<9;i++)
                    {
                            openmv[i]=0x00;
                    }           
            }
    }   
    else
    {
        state = 0;
        bit_number=0;
                for(int i=0;i<9;i++)
                {
                        openmv[i]=0x00;
                }
    }
}


收藏 评论8 发布时间:2020-4-18 23:22

举报

8个回答
七哥 回答时间:2020-4-19 00:19:58
Openmv_Receive_Data(temp);//解包函数

不能放在中断接收中去,只能在主循环中。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wenyangzeng 回答时间:2020-4-19 07:24:52
那个
if(state==0&&data==0xcc)有一个运算优先等级问题,应该写成:
if((state==0)&&(data==0xcc))

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

水晶之泪0517 回答时间:2020-4-19 10:57:12
接收处理函数应该放在主函数,大循环中,中断里边做的事比较多,中断应该尽量的短,可以在中断里将数据全部接收完成之后再进行业务判断处理

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

weihongshuo 回答时间:2020-4-19 14:39:29
wenyangzeng 发表于 2020-4-19 07:24
那个
if(state==0&&data==0xcc)有一个运算优先等级问题,应该写成:
if((state==0)&&(data==0xcc)) ...

我查了一下,==的优先级是在&&之前的,应该不是这里的问题
mylovemcu 回答时间:2020-4-20 08:47:18
逻辑有问题  
数组自增变量应该是全局变量  局部变量 每次调一次函数都会清零一次  导致数组的数据不能增加
状态变量也是  每次调用函数都清零了  上次的置位没有意义了  程序走不下去

再说要接几个数据  也不用搞这么复杂的  就在中断里用if判断就可以接  判断头尾  就可以了

置一个接收完成标志  初始清零
接收到第一个字符存在数组0里面  后续就判断数组0的状态  
接收到的数据不是尾的时候  数据依次存入数组  
接收到尾之后  接收标志置位

所有的变量都用全局变量  局部变量只做缓存  

评分

参与人数 1蝴蝶豆 +4 收起 理由
STMCU + 4

查看全部评分

STM1024 回答时间:2020-4-20 09:08:51
IRQHandler中只做最基本的接收原始字节流的工作,放到一个缓冲区中。

解包函数放在主循环中,或者是在Idle中断时做处理,而且这里面没有看到你如何做缓存的工作。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

xiesir 回答时间:2020-4-20 09:36:48
中断里处理串口也费不了多少时延
适苦欲死 回答时间:2020-4-27 09:49:48
做一个数组,把要发的数放到数组中,串口里写一个发送字符串函数整体发送

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版