初级会员
- 积分
- 74
- 金钱
- 74
- 注册时间
- 2018-7-10
- 在线时间
- 17 小时
|
3金钱
我使用的是UCOS3+STM32F407,串口收发用的是DMA的空闲接收与DMA直接发送。程序里起了8个任务,现在有个现象: 比如我的串口1--DMA空闲中断收到得数据用消息队列传递到任务里,一开始任务1用着还行,后来这个任务1挂起了,任务2再去接收这个队列的数据,传的size全是0,无奈我只好使用信号量通知任务收到串口数据了,在任务里直接处理串口数据,但用着用着,别的串口2的收发处理也这么做,会发现遇到一次大数组传递(7-8K数据量)我的串口里打印接收字节是对的,但在任务里看竟然接收字节数是0
想求问大家遇到传递后数据不对该怎么做啊?求谢!
部分代码如下:
volatile u16 USART6_ReceiveSize = 0;
//空闲中断
void USART6_IRQHandler(void)
{
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
OS_ERR err;
volatile u16 data,j;
if(USART_GetITStatus(USART6,USART_IT_IDLE) != RESET)
{
DMA_Cmd(DMA2_Stream2, DISABLE); //关闭DMA,防止处理其间有数据
data = USART6->SR;
data = USART6->DR;
USART6_ReceiveSize = USART6_REC_LEN - DMA_GetCurrDataCounter(DMA2_Stream2);
if(USART6_ReceiveSize !=0)
{
if(Qcamera_flag != 0)
{
OSSemPost(&PHOTO_SEM, OS_OPT_POST_ALL, &err); //发送信号量
DEBUG("USART6_ReceiveSize: %d\r\n", USART6_ReceiveSize); 这块收的数据没问题
}
任务里
u8 read_photo(u8 waittick)
{
u8 i = 0, readphoto_flag = 0;
u16 start_flag = 0, stop_flag = 0;
u8 buff[20] = {0x00};
u16 j = 0, photo_templen = 0;
OS_ERR err;
buff[i++] = 0x56;
buff[i++] = 0x00;
buff[i++] = 0x32;
buff[i++] = 0x0C;
buff[i++] = 0x00;
buff[i++] = 0x0A;
buff[i++] = 0x00; //启始地址(起始地址必须是8的倍数,一般设00 00)
buff[i++] = 0x00;
buff[i++] = 0x00;
buff[i++] = 0x00;
buff[i++] = 0x00; //图片数据长度(先高位字节,后低位字节)
buff[i++] = 0x00;
buff[i++] = photo_length_hi;
buff[i++] = photo_length_lo;
photo_length = ( photo_length_hi << 8) | photo_length_lo; //2个字节合并为1个u16类型数据
buff[i++] = 0x00; //间隔时间(= ZZ ZZ*0。01 毫秒 ,最好设小点如 00 0A)
buff[i++] = 0x00; //根据我的需要还是设大点
photo_length_hi = 0x00;
photo_length_lo = 0x00;
SendBytesInfoProc(USART6_TX, buff, i);
OSSemPend(&PHOTO_SEM, waittick, OS_OPT_PEND_BLOCKING, 0, &err); //请求信号量
printf("uart6_size: %d\r\n", USART6_ReceiveSize); 这块打的是0
for(j = 0; j < USART6_ReceiveSize; j++)
{
|
|