本帖最后由 vrxiaochouyu 于 2018-9-3 12:20 编辑 CDC先给STM32发指令,然后STM32获得uart2的11个数据(数据结构,一位数据长度,跟着10个数据),通过CDC把10位数据发给电脑。 问题,1,发的数据数量总是有问题。这个已经通过中间变量解决,但是目前仍不知道数量改变的机制。 2,发一次指令有用,但是下一次就没有数据了,然后再发一次才有。经过示波器查看,uart没有动作。所以问题应该是没有触发CDC。应该如何解决呢? //回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { UNUSED(huart2); Rx_temp[R_Num]=aRxBuffer; if (R_Num==0) { Rx_Num=Rx_temp[0]; } R_Num++; if (R_Num>Rx_Num) { Rx_Flag = 1; R_Num=0; } if(R_Num>15) { Rx_Flag = 1; R_Num=0; } HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1); } int main(void) { //初始化略 HAL_UART_Receive_IT(&huart2,(uint8_t *)&aRxBuffer,1);//开启uart中断 while (1) { if (Rx_Flag==1) { TempNum = (uint8_t)Rx_Num;//如果没有这个中间变量,Rx_Num会自己变化,不知道是为什么。 for (i=0;i<TempNum;i++) { UserTxBufferFS=Rx_temp[i+1]; } while( CDC_Transmit_FS(UserTxBufferFS,TempNum) != USBD_OK ); Rx_Flag=0; Rx_Num=0; R_Num=0; } if (CDC_rx_len) { cmd = UserRxBufferFS; switch (cmd) { case 0xF0: cr = UserRxBufferFS[i+3]; lf = UserRxBufferFS[i+4]; break; } } if (cr==0x0D && lf==0x0A) { switch (cmd) { case 0xF0: temp=UserRxBufferFS[i+1]; HAL_UART_Transmit(&huart2,(uint8_t *)&temp,1,1000); i=i+5; break; }} if(i>=CDC_rx_len) { CDC_rx_len = 0; i=0; } } |
看了一些例程,感觉这个变量确实受到变化影响,研究半天只能从代码中看看是不是数据传输有问题,
UNUSED(huart1);
Rx_temp[Num]=aRxBuffer;
if (Num==0)
{
Rx_Num=Rx_temp[0];
}
Num++;
if (Num==Rx_Num+1)
{
Rx_Flag = 1;
Num=0;
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
}
if (Rx_Flag==1)
{
//测试10个数,如果不加下边的循环Rx_Num=10,加了循环在这里Rx_Num=5
for (i=0;i<Rx_Num;i++)
{
UserTxBufferFS=Rx_temp[i+1];
}
//测试10个数,在这里Rx_Num=2
while( CDC_Transmit_FS(UserTxBufferFS,Rx_Num) != USBD_OK );
Rx_Flag=0;
Rx_Num=0;
Num=0;
}
if (CDC_rx_len)
{
cmd = UserRxBufferFS;
switch (cmd)
{
case 0xF0: cr = UserRxBufferFS[i+3];
lf = UserRxBufferFS[i+4];
break;
}
if (cr==0x0D && lf==0x0A)
{
switch (cmd)
{
case 0xF0:reg_addr = UserRxBufferFS[i+1];
reg_data = UserRxBufferFS[i+2];
i=i+5;
I2C_Write(0xF0, reg_addr, reg_data);
break;
}
}
if(i>=CDC_rx_len)
{
CDC_rx_len = 0;
i=0;
}
Rx_flag=1; //接受到头帧}
else if (Rx_flag==1){
Rx_flag=0; //接收到命令,清空标志Tx_PC(0xAA);switch (Rx_data){case 0x00:{
ADG707_state&=0xf8; //A2=0,A1=0,A0=0P4OUT=ADG707_state;Tx_PC(0x00);break;}}}
评分
查看全部评分
谢谢,和我这现象差不多。加了循环,数值就变了。不过加个中间变量就好了。那个读取总是丢一次的应该如何解决呢?应该清除哪个标志位才对呢
最新的发现 貌似是因为i变了。
if (CDC_rx_len)
{
cmd = UserRxBufferFS;
switch (cmd)
{
case 0xF0:
cr = UserRxBufferFS[i+3];
lf = UserRxBufferFS[i+4];
break;
}
}
if (cr==0x0D && lf==0x0A)
{
switch (cmd)
{case 0xF0:
temp=UserRxBufferFS[i+1];
HAL_UART_Transmit(&huart2,(uint8_t *)&temp,1,1000);
i=i+5;
break;
}
现在发现,cmd值在异常的时候为0。UserRxBufferFS却不是0。然后把i打印出来。发现,i为0A。不知道在哪里变的。
评分
查看全部评分
楼主,我用cunbe产生的CDC,发现接收函数那边有问题。你只用CDC通信,没问题吗?我先做的回环实验,PC有的时候接收不到。