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

查看: 2591|回复: 6

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

[复制链接]

2

主题

0

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-7-6 14:44:15 | 显示全部楼层 |阅读模式
 大神们。。。又遇到一个问题,我用串口助手PC发串口帧给STM32无返回。。。。。
 
我的帧定义如下:
单片机接收的数据帧(其中不包括帧头:0x55)
typedef struct
{
unsigned charucIndex;                  //从器件编号
unsigned charucOprType;               //操作类型,读0001
unsigned charucOprAddr2;             //Addr2 地址低位
unsigned charucOprAdd1      //Addr1  地址中间
unsigned charucOprAdd0;             //Addr0 地址高位
unsigned charucOprDataLen;          //len  数据长度(ucDataBuffer内的数据长度)
unsigned charucXorValue;            //Xor  校验数据(异或)
unsigned charucDataBuffer[256];       //DataBuffer 数据
}
所有数据均为16进制即HEX,请自觉在前面加上0x
第一个字节为帧头0x55
第二个字节代表操作从器件编码:
00selfTestResult0xffff的状态字,如发55 00 则返回,后面位没用到)
01 ADC
02:  IIC_INA220
03:  IIC_EEPROM
04:  EPLD_GPIO
05:  EthernetKSZ8041
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就应该有返回的,帧里面余下的字节定义都没用到,而其他的第二以后的命令有的会用到余下的字节定义,现在是用串口助手模拟发整个帧命令无返回,不知道各位大神是否明白我的意思?
 
我的代码是否有问题?为啥不到返回值呢?

<
回复

使用道具 举报

2

主题

71

回帖

0

蝴蝶豆

初级会员

最后登录
2018-11-13
发表于 2014-7-11 22:09:49 | 显示全部楼层

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

能够收发数据,证明串口是通的,问题可能出在你的数据接受解析和发送上,没仔细看你的程序,你可以先分析你的数据接收的解析是否正确,然后在数据发送,这样一步步来,貌似不是完整程序
回复 支持 反对

使用道具 举报

24

主题

514

回帖

6

蝴蝶豆

金牌会员

最后登录
2019-4-8
发表于 2014-7-11 22:44:07 | 显示全部楼层

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

有JLINK吗,跟一下全出来了。。。。
回复 支持 反对

使用道具 举报

2

主题

295

回帖

0

蝴蝶豆

初级会员

最后登录
2018-4-6
发表于 2014-7-12 08:27:44 | 显示全部楼层

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

仿真一看,看看stm32收到的数据是什么,发出数据了么
回复 支持 反对

使用道具 举报

9

主题

178

回帖

0

蝴蝶豆

高级会员

最后登录
1970-1-1
发表于 2014-7-14 14:10:38 | 显示全部楼层

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

可以先测试单独字节收发是否正确,然后再加入你的协议解析部分,以确定问题
回复 支持 反对

使用道具 举报

23

主题

195

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2014-7-17 16:57:36 | 显示全部楼层

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

如果只是字节问题, 还是好解决的
回复 支持 反对

使用道具 举报

91

主题

4603

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2014-7-18 01:33:13 | 显示全部楼层

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

TxBufEmpty = 1
在转移指针的时候看看是不是转错了
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版