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;
}
}
如果单独使用CDC,没有问题。连续收发都正常。 本帖最后由 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;}}} feixiang20 发表于 2018-9-1 01:07
看了一些例程,感觉这个变量确实受到变化影响,研究半天只能从代码中看看是不是数据传输有问题,
UNUSED(hu ...
谢谢,和我这现象差不多。加了循环,数值就变了。不过加个中间变量就好了。那个读取总是丢一次的应该如何解决呢?应该清除哪个标志位才对呢 本帖最后由 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。不知道在哪里变的。 已解决。在uart发送完,加一个i=0,就好了。是因为中断打断了i的复位吗? vrxiaochouyu 发表于 2018-8-31 18:15
如果单独使用CDC,没有问题。连续收发都正常。
楼主,我用cunbe产生的CDC,发现接收函数那边有问题。你只用CDC通信,没问题吗?我先做的回环实验,PC有的时候接收不到。
页:
[1]