初级会员
- 积分
- 168
- 金钱
- 168
- 注册时间
- 2020-9-2
- 在线时间
- 41 小时
|
楼主 |
发表于 2021-1-9 09:26:27
|
显示全部楼层
本帖最后由 binzhang 于 2021-1-9 09:40 编辑
你好,我用原子的串口接收数据的例程,利用串口1接收到的数据然后这做校验通过串口2 发送出去,串口1接收到数据的频率是100ms一次,但是串口2 发送数据时数据更新很慢!//串口1接收数据校验,优先级是4
void Analy_task(void *p_arg)
{
unsigned char check_sum;
u8 i=0;
OS_ERR err;
CPU_TS ts;
CPU_SR_ALLOC();
p_arg = p_arg;
while(1)
{
OSTaskSemPend ((OS_TICK )0, //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果信号量不可用就等待
(CPU_TS *)&ts, //获取信号量被发布的时间戳
(OS_ERR *)&err); //返回错误类型
for(i=0;i<USART1_REC_LEN;i++)
{
printf("USART1_RX_BUF[%d] = 0x%02hhx\r",i,USART1_RX_BUF);
}
printf("Analy wait signal sucess\r\n");
if((USART1_RX_BUF[0]==0xff)&&(USART1_RX_BUF[1]==0xff))
{
check_sum=USART1_RX_BUF[2]+USART1_RX_BUF[3]+USART1_RX_BUF[4]+USART1_RX_BUF[5]+USART1_RX_BUF[6]+USART1_RX_BUF[7]+USART1_RX_BUF[8]+USART1_RX_BUF[9]+USART1_RX_BUF[10]+USART1_RX_BUF[11]+USART1_RX_BUF[12]+0xff+0xff;
check_sum=~check_sum;
check_sum=check_sum&0xff;
printf("check_Sum=0x%hx",check_sum);
printf("buff[%d] = 0x%02hhx",13, USART1_RX_BUF[13]);
if(check_sum==USART1_RX_BUF[13])
{
RecToUsart2();
OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);//发送信号量
}
else
{
clearUsart1Buff();printf("usart1 del");
}
}
else
{
clearUsart1Buff();
}
OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
}
}
//串口2发送任务数据校验优先级是6
void check_task(void *p_arg)
{
unsigned char check_sum;
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
while(1)
{
OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
printf("check wait signal success\r\n");
check_sum=USART2_BUFF[2]+USART2_BUFF[3]+USART2_BUFF[4]+USART2_BUFF[5]+USART2_BUFF[6]+USART2_BUFF[7]+USART2_BUFF[8]+USART2_BUFF[9]+USART2_BUFF[10]+USART2_BUFF[11]+USART2_BUFF[12]+USART2_BUFF[13]+USART2_BUFF[14]+USART2_BUFF[15]+USART2_BUFF[16]+USART2_BUFF[17]+USART2_BUFF[18]+0xff+0xff;
check_sum=~check_sum;
check_sum=check_sum&0xff;
printf("check_Sum2=0x%hx\r",check_sum);
if(USART2_BUFF[0]==0xff&&USART2_BUFF[1]==0xff&&USART2_BUFF[2]!=0x00&&USART2_BUFF[3]!=0x00)
{
USART2_BUFF[18]=check_sum; printf("USART2_BUFF[%d] = 0x%02hhx\r\n",18, USART2_BUFF[18]);
OSTaskSemPost((OS_TCB *)&USART2_SendData_TaskTCB, //目标任务
(OS_OPT )OS_OPT_POST_NONE, //没选项要求
(OS_ERR *)&err);
}
else
{
clearUsart2Buff();
}
//OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);//发送信号量
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
}
}
//串口2发送数据任务函数,优先级是7
void USART2_SendData_task(void *p_arg)
{
u8 i=0; OS_ERR err;
CPU_TS ts; CPU_SR_ALLOC();
p_arg = p_arg;
while(1)
{
OSTaskSemPend ((OS_TICK )0, //无期限等待 (OS_OPT )OS_OPT_PEND_BLOCKING, //如果信号量不可用就等待 (CPU_TS *)&ts, //获取信号量被发布的时间戳 (OS_ERR *)&err); //返回错误类型
printf("usart2 wait signal\r\n");
for(i=0;i<USART2_LEN;i++)
{
while( RESET == USART_GetFlagStatus( USART2, USART_FLAG_TXE ));
USART_SendData(USART2,USART2_BUFF);
}
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
}
}
void USART1_IRQHandler(void)
{
unsigned char r;
OS_ERR err;
OSIntEnter();
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)
{
r=USART_ReceiveData(USART1);
USART1_RX_BUF[USART1_REC_CNT]=r;
USART1_REC_CNT++;
if(USART1_REC_CNT>(USART1_REC_LEN-1))
{
printf("数据接收完成,释放一个任务信号量到数据分析任务\r\n");
OSTaskSemPost((OS_TCB *)&Analy_TaskTCB, //目标任务
(OS_OPT )OS_OPT_POST_NONE, //没选项要求
(OS_ERR *)&err);
}
}
OSIntExit();
}
|
|