你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
vrxiaochouyu 提问时间:2018-8-31 18:12 /
本帖最后由 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;
          }

}


收藏 评论6 发布时间:2018-8-31 18:12

举报

6个回答
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[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;}}}

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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)
                 {
                      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。不知道在哪里变的。
vrxiaochouyu 回答时间:2018-9-3 13:47:18
已解决。在uart发送完,加一个i=0,就好了。是因为中断打断了i的复位吗?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

那一世嘤鸣 回答时间:2018-9-14 15:17:58
vrxiaochouyu 发表于 2018-8-31 18:15
如果单独使用CDC,没有问题。连续收发都正常。

楼主,我用cunbe产生的CDC,发现接收函数那边有问题。你只用CDC通信,没问题吗?我先做的回环实验,PC有的时候接收不到。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版