vrxiaochouyu 发表于 2018-8-31 18:12:01

uart接收数据,CDC发给电脑总有问题。

本帖最后由 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=aRxBuffer;
   if (R_Num==0)
{
    Rx_Num=Rx_temp;
}
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;
    }

   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)
               {
                      case0xF0:
                                    cr = UserRxBufferFS;
                                 lf = UserRxBufferFS;
                  break;
                   }
} if (cr==0x0D && lf==0x0A)
      {
          switch (cmd)
          {
            case0xF0:

                           temp=UserRxBufferFS;

                     HAL_UART_Transmit(&huart2,(uint8_t *)&temp,1,1000);   

                           i=i+5;      
                        break;   
            }}         
if(i>=CDC_rx_len)
         {
         CDC_rx_len = 0;
         i=0;
          }

}


vrxiaochouyu 发表于 2018-8-31 18:15:59

如果单独使用CDC,没有问题。连续收发都正常。

feixiang20 发表于 2018-9-1 01:07:43

本帖最后由 feixiang20 于 2018-9-1 01:09 编辑

看了一些例程,感觉这个变量确实受到变化影响,研究半天只能从代码中看看是不是数据传输有问题,
UNUSED(huart1);
Rx_temp=aRxBuffer;
if (Num==0)
{
Rx_Num=Rx_temp;
}
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;
}
//测试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;
lf = UserRxBufferFS;
break;
}
if (cr==0x0D && lf==0x0A)
{
switch (cmd)
{
case 0xF0:reg_addr = UserRxBufferFS;
reg_data = UserRxBufferFS;
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;}}}

vrxiaochouyu 发表于 2018-9-3 11:12:51

feixiang20 发表于 2018-9-1 01:07
看了一些例程,感觉这个变量确实受到变化影响,研究半天只能从代码中看看是不是数据传输有问题,
UNUSED(hu ...

谢谢,和我这现象差不多。加了循环,数值就变了。不过加个中间变量就好了。那个读取总是丢一次的应该如何解决呢?应该清除哪个标志位才对呢

vrxiaochouyu 发表于 2018-9-3 12:18:02

本帖最后由 vrxiaochouyu 于 2018-9-3 13:41 编辑

最新的发现 貌似是因为i变了。
if (CDC_rx_len)
    {
      cmd = UserRxBufferFS;

               switch (cmd)
               {
                      case0xF0:

      cr = UserRxBufferFS;
                  lf = UserRxBufferFS;
                  break;

                   }
}
if (cr==0x0D && lf==0x0A)
      {
          switch (cmd)
          {case0xF0:
                        temp=UserRxBufferFS;
                     HAL_UART_Transmit(&huart2,(uint8_t *)&temp,1,1000);   
                  
                           i=i+5;      
                        break;   
                   }
现在发现,cmd值在异常的时候为0。UserRxBufferFS却不是0。然后把i打印出来。发现,i为0A。不知道在哪里变的。

vrxiaochouyu 发表于 2018-9-3 13:47:18

已解决。在uart发送完,加一个i=0,就好了。是因为中断打断了i的复位吗?

那一世嘤鸣 发表于 2018-9-14 15:17:58

vrxiaochouyu 发表于 2018-8-31 18:15
如果单独使用CDC,没有问题。连续收发都正常。

楼主,我用cunbe产生的CDC,发现接收函数那边有问题。你只用CDC通信,没问题吗?我先做的回环实验,PC有的时候接收不到。
页: [1]
查看完整版本: uart接收数据,CDC发给电脑总有问题。