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

查看: 2582|回复: 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版