打印
[STM32F4]

通过串口助手模拟PC发串口帧给STM32无返回

[复制链接]
1829|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kelywu|  楼主 | 2014-7-6 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大神们。。。又遇到一个问题,我用串口助手PC发串口帧给STM32无返回。。。。。



我的帧定义如下:

单片机接收的数据帧(其中不包括帧头:0x55)

typedef struct

{

unsigned charucIndex;                  //从器件编号

unsigned charucOprType;               //操作类型,读00写01

unsigned charucOprAddr2;             //Addr2 地址低位

unsigned charucOprAdd1;      //Addr1  地址中间

unsigned charucOprAdd0;             //Addr0 地址高位

unsigned charucOprDataLen;          //len  数据长度(ucDataBuffer内的数据长度)

unsigned charucXorValue;            //Xor  校验数据(异或)

unsigned charucDataBuffer[256];       //DataBuffer 数据

}

所有数据均为16进制即HEX,请自觉在前面加上0x)

第一个字节为帧头0x55

第二个字节代表操作从器件编码:

00:selfTestResult(0xffff的状态字,如发55 00 则返回,后面位没用到)

01: ADC

02:  IIC_INA220

03:  IIC_EEPROM

04:  EPLD_GPIO

05:  Ethernet(KSZ8041)

06: FSMC_Flash(暂留)

07:  FSMC_SRAM(暂留)

第三个字节代表读写操作类型:00-读,01-写

第四个字节代表待读写寄存器的地址低位

第五六个字节代表待读写寄存器的地址高位

第七个字节代表数据长度

第八个字节为第2,3,4,5,6,7,9个字节数据的异或,用于数据校验

第九个字节代表往对应寄存器写入的数据(读命令下该字节无意义)

注:所有命令下发正确后都会首先返回:AA 50 FF(EE),文中描述的返回值皆是指在这之后的数据。AA:收到帧头  50:校验正确   FF:写入正确(EE:写入错误)



我的串口采用接收中断:

串口配置:

static void USART_Config(void)

{

  USART_InitTypeDef USART_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

  u32 tm;



  /* USARTx configured as follows:

        - BaudRate = 115200 baud

        - Word Length = 8 Bits

        - One Stop Bit

        - No parity

        - Hardware flow control disabled (RTS and CTS signals)

        - Receive and transmit enabled

  */

  USART_InitStructure.USART_BaudRate = 115200;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;



  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_USART1);   //PA9

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);   //PA10



  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_9|GPIO_Pin_10);

  GPIO_Init(GPIOA,&GPIO_InitStructure);

  USART_Init(USART1, &USART_InitStructure);

  USART_Cmd(USART1, ENABLE);

  tm = GetTimeBaseMs();



  while((GetTimeBaseMs() - tm) < 1){}

  USART_ClearFlag(USART1,USART_FLAG_TC);

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  ///********************USART4**************************/

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);  

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_UART4);    //PC10

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_UART4);    //PC11



  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_10|GPIO_Pin_11);

  GPIO_Init(GPIOC,&GPIO_InitStructure);

  USART_Init(UART4, &USART_InitStructure);

  //USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);  

  USART_Cmd(UART4, ENABLE);      

}



串口中断配置

static void NVIC_config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* NVIC configuration */

/* Configure the Priority Group to 2 bits */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);



/* Enable the USARTx Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   

NVIC_Init(&NVIC_InitStructure);      

}



判断帧有无接收完全

u8 IsUART1FrameReady()

{

u8 ucSum = 0;  

u8 Txbuf[1];  

   if(RecComplete == 0)

   {

     return 0;

   }

   else

   {

    RecComplete = 0;



ucSum ^= Uartpkt.ucPortType;

ucSum ^= Uartpkt.ucOprType;

ucSum ^= Uartpkt.ucOprDUT;

ucSum ^= Uartpkt.ucOprChannel;

ucSum ^= Uartpkt.ucOprControl;

ucSum ^= Uartpkt.ucOprDataLen;

ucSum ^= Uartpkt.ucDataBuffer[0];

if(Uartpkt.ucXorValue == ucSum)

{

  Txbuf[0] = 0x50;   //校验正确返回50

  UART1_SendData(Txbuf,sizeof(Txbuf));

  return 1;

}

else

{

  return 0;

}

   }

}



串口中断函数

void USART1_IRQHandler(void)

{

u8 ReceiveChar;   

u8 buf[1];  

  /* 接收 */

  if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)    //收到字符

  {

   ReceiveChar = USART_ReceiveData(USART1);

   if(ReceiveChar == PKT_HEAD)

{

    RxIndex = 0;

    buf[0] = 0xaa; //收到帧头返回AA

    UART1_SendData(buf,1);

}

else if(RxIndex < 7)  //

{

    *((u8*)&Uartpkt + RxIndex) = ReceiveChar;

    RxIndex++;

}

else if((RxIndex-7) < Uartpkt.ucOprDataLen)

{

    Uartpkt.ucDataBuffer[RxIndex-7] =  ReceiveChar;

    RxIndex++;

}

else

{

  //USART_ClearFlag(USART1,USART_FLAG_RXNE);

  RecComplete = 1;   //

}

  }

  /* 发送*/

  if (USART_GetITStatus(USART1, USART_IT_TXE) == SET)

  {

    if (TxIndex < DataLength)

    {

      /* Send Transaction data */

      USART_SendData(USART1, TxBuf[TxIndex++]);

    }

    else

    {

      /* Disable the Tx buffer empty interrupt */

      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

   TxBufEmpty = 1;    //

    }

  }

}



主函数

while (1)

  {



   if(IsUART1FrameReady() == 1)

{

    ParsePaket();//分析串口帧

}

}





目前只能实现用串口助手发55返回AA,如果我在串口助手里发整串帧命令,比如第一个获取selftestresult的命令:

55 00 00 00 00 00 00 00 00 也只能返回AA,而返回不了0xffff的状态量

串口帧有长有短,比如第一个其实只发55 00就应该有返回的,帧里面余下的字节定义都没用到,而其他的第二以后的命令有的会用到余下的字节定义,现在是用串口助手模拟发整个帧命令无返回,不知道各位大神是否明白我的意思?



我的代码是否有问题?为啥不到返回值呢?
沙发
airwill| | 2014-7-6 20:58 | 只看该作者
看起来是个完整的协议分析了, 其实里面的问题还多着呢, 要是数据包里有PKT_HEAD, 数据传输错误怎么处理

不要动不动就上来大段大段的代码, 让人家帮你抓 bug. 先得自己理清楚协议, 最好先找本专业的书, 冲冲电.

使用特权

评论回复
板凳
airwill| | 2014-7-6 21:00 | 只看该作者
看起来是个完整的协议分析了, 其实里面的问题还多着呢, 要是数据包里有PKT_HEAD, 数据传输错误怎么处理
其实你自己有工作板, 可以调试找问题, 而网友们却只能靠猜!
不要动不动就上来大段大段的代码, 让人家帮你抓 bug. 先得自己理清楚协议, 如果自己也弄不清怎么定协议, 最好先找本专业的书, 冲冲电.

使用特权

评论回复
地板
airwill| | 2014-7-6 21:02 | 只看该作者
看起来是个完整的协议分析了, 其实里面的问题还多着呢, 要是数据包里有PKT_HEAD, 数据传输错误怎么处理
其实你自己有工作板, 可以调试找问题, 而网友们却只能靠猜!
不要动不动就上来大段大段的代码, 让人家帮你抓 bug. 先得自己理清楚协议, 如果自己也弄不清怎么定协议, 最好先找本专业的书, 冲冲电.

使用特权

评论回复
5
wlzxzq| | 2014-7-6 21:21 | 只看该作者
第一个问题 结构体定义不对

使用特权

评论回复
6
江枫渔火| | 2014-7-7 00:23 | 只看该作者
我从来不看代码,就会凭空胡说。

这个问题应该是这样解决:
1,首先确保串口驱动是能正常收发的,比如发一个字符,收一个字符,收发一串字符。
2,你定义的数据包协议无法调通时,你先要确认你收发了什么,用串口监视去看,不要太相信串口助手。
3,如果你发送的字节都是对的,那就看你处理这个数据包的过程有些什么地方不对,先把一些条件给隐藏,逐个击破!

使用特权

评论回复
7
kelywu|  楼主 | 2014-7-7 10:50 | 只看该作者
wlzxzq 发表于 2014-7-6 21:21
第一个问题 结构体定义不对

结构体定义哪里有问题?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

6

帖子

1

粉丝