本帖最后由 DATOUDAda 于 2019-9-29 09:51 编辑
问题:1、我开个串口中断接收数据,想要接收到第一个数据如0XAD,单片机发送自己的地址过去,例如单片机收到了0XAD,然后就
USART_SendData(DEBUG_USARTx,(DMX512_para_set.g_DMX512_address>>2));
USART_SendData(DEBUG_USARTx,(DMX512_para_set.g_DMX512_address&0xFF));给串口助手。接下来我再
通过串口助手发送一帧数据,除开0X2D的帧头和0X08的指令长度,单片机用数组将剩下的8个BYTE存起来。但是这个时候存
入的数组是错漏的如:
2、当我把 USART_SendData(DEBUG_USARTx,(DMX512_para_set.g_DMX512_address>>2));
USART_SendData(DEBUG_USARTx,(DMX512_para_set.g_DMX512_address&0xFF));不放在串口中断里,而是当我
接收到0XAD时,就令USART1_ADDRESS_TX_FLAG=1;然后在main函数里符合USART1_ADDRESS_TX_FLAG=1的IF条件再执行
发送地址,后面的数组接收就不会错漏了。为什么,百思不得其解!!!!!
/////////////完整代码/////////////
/////////////问题:为什么接收跟发送不能放在同个中断函数里里?////////////
希望论友们给点力
void DEBUG_USART_IRQHandler(void)
{
int i;
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)==SET)
{
USART_ClearITPendingBit(DEBUG_USARTx, USART_IT_RXNE);
USART_receive_data_9bit = USART_ReceiveData(DEBUG_USARTx); //USART_ReceiveData内部已经 & (uint16_t)0x01FF
if(USART_receive_data_9bit==0xAD&&Order_Length==0)
{
USART_SendData(DEBUG_USARTx,(DMX512_para_set.g_DMX512_address>>2));
USART_SendData(DEBUG_USARTx,(DMX512_para_set.g_DMX512_address&0xFF));
USART1_ADDRESS_TX_FLAG=1;
}
else if((USART_receive_data_9bit)==0X2D&&Order_Length==0&&USART1_ADDRESS_TX_FLAG==1) //标志位阅后即焚
{
USART1_HEADER_FLAG=1;
USART1_ADDRESS_TX_FLAG=0;
}
else if(USART1_HEADER_FLAG==1&&USART_receive_data_9bit==0x08&&Order_Length==0)//标志位阅后即焚
{
Order_Length=0X08;
USART1_HEADER_FLAG=0;
}
else if(Order_Length==0x08)
{
g_packet_receive_from_DMX512[slot_counter]=USART_receive_data_9bit;//正常数据把第九位删掉
g_DMX512_data_receive_change_or_not=DMX512_DATA_CHANGE;
slot_counter++;
if(slot_counter==8)
{
Order_Length=0;
}
}
}
|