本帖最后由 其实很简单 于 2018-3-28 15:28 编辑
通过串口2,用定时器2作为超时定时器,超时以后默认为一帧完整数据接收完成。
在任务函数里将接收到数据在通过串口2发送。
现象是每次发送是个字节,单只能接收到第一个字节:例如发送 11 22 33 44 55 66 77 88 99 00 ,串口助手接收到数据为 11 00 00 00 00 00 00 00 00 00
究竟是哪里出问题了呢?
下面是代码
void vTaskStart(void)
{
xTaskCreate( vTaskLED, /* 任务函数 */
"vTaskLED", /* 任务名 */
512, /* 任务栈大小,单位word,也就是4字节 */
NULL, /* 任务参数 */
1, /* 任务优先级*/
&xHandleTaskLED ); /* 任务句柄 */
// xTaskCreate( vTaskDO, /* 任务函数 */
// "vTaskDO", /* 任务名 */
// 512, /* 任务栈大小,单位word,也就是4字节 */
// NULL, /* 任务参数 */
// 2, /* 任务优先级*/
// &xHandleTaskDO ); /* 任务句柄 */
xTaskCreate( vTaskAndroid, /* 任务函数 */
"vTaskAndroid", /* 任务名 */
512, /* 任务栈大小,单位word,也就是4字节 */
NULL, /* 任务参数 */
2, /* 任务优先级*/
&xHandleTaskANDROID ); /* 任务句柄 */
}
QueueHandle_t u2QueueRx; //信息队列句柄
void vTaskAndroid(void *pvParameters)
{
uint8_t u8Send_buff[20],cnt;
u2QueueRx=xQueueCreate(50,sizeof(u8)); //创建消息队,列深度为50
while(1)
{
/*wait time:0,portMAX_DELAY*/
if(xQueueReceive(u2QueueRx,&u8Send_buff,10/portTICK_RATE_MS)==pdTRUE)
{
bsp_UART2_Send_Data(u8Send_buff,10);
for(cnt=0;cnt<20;cnt++)
{
u8Send_buff[cnt]=0;
}
}
/* vTaskDelayUntil是绝对延迟,vTaskDelay是相对延迟。*/
vTaskDelay(100);
}
}
extern u8 time2;
void TIM2_IRQHandler(void)
{
BaseType_t xResult;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update );
STOP_TIME2();
xQueueSendFromISR(u2QueueRx, (void *)&UART2_STATU.RX_BUF, &xHigherPriorityTaskWoken);/*接收完成把数据通过消息队列发送(void *)&ptMsg,*/
uart2_clear();
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearFlag(USART2,USART_FLAG_RXNE);
START_TIME2();
if(UART2_STATU.Index==0) time2=0;
if(UART2_STATU.Index<100)
{
time2=0;
UART2_STATU.RX_BUF[UART2_STATU.Index++]=USART_ReceiveData(USART2);
}
else UART2_STATU.Index=0;
}
//溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题[牛人说要这样]
// if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET)
// {
// USART_ClearFlag(USART2,USART_FLAG_ORE);
// }
}
void vTaskAndroid(void *pvParameters)
{
uint8_t u8Send_buff[20],cnt;
u2QueueRx=xQueueCreate(50,sizeof(u8)); //创建消息队,列深度为50
while(1)
{
/*wait time:0,portMAX_DELAY*/
if(xQueueReceive(u2QueueRx,&u8Send_buff,0/portTICK_RATE_MS)==pdTRUE)
{
bsp_UART2_Send_Data(u8Send_buff,10);
for(cnt=0;cnt<20;cnt++)
{
u8Send_buff[cnt]=0;
}
}
/* vTaskDelayUntil是绝对延迟,vTaskDelay是相对延迟。*/
vTaskDelay(100);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
将队列定义改为
uint8_t u8Send_buff[20],cnt;
u2QueueRx=xQueueCreate(5,sizeof(u8Send_buff)); //创建消息队,列深度为5
上面的队列定义含义是:队列深度为5的长度为20的队列。
1)这个队列深度的作用是什么意思
2)是不是所有队列默认的都是队列里的每一个元素都是8bit的,如果想传输16bit的数据怎么办
u2QueueRx=xQueueCreate(5,sizeof(u16Send_buff)); //创建消息队,列深度为5
深度为5,大小为20
你这边每次Push相当于push进去了20个字节,深度减1
接收方每次接收到对应的20个字节,收完后深度加1
如此反复。。。
谢谢解答
一周热门 更多>