STM32串口发送问题

[复制链接]
 楼主| hsbjb 发表于 2012-3-23 18:11 | 显示全部楼层 |阅读模式
用PC 发送一组16进制的数 当检验到有FE以后 接受FE 之后的数字
可是我在发送数据之后 串口接收的第一组数据是正确的 之后就接收的少了一位

例如 发送
FE FE 23 24 25 26 16
应该接收到
23 24 25 26 16

我接受的成了 24 25 26 16

大家帮我看看我的程序有什么问题 这是我接收中断的程序


void USART1_IRQHandler(void)
{  

char RX;
static char rx[8];

char *p;
static int i=0,s=0;

if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断发生接收中断  
  {
   
  RX=USART_ReceiveData(USART1);
   
  if(RX==0xFE)
  s=1;
  else if(s!=0)
  rx[i++]=RX;   
  if(RX==0x16)
  {
   
  p=rx;
  while(i--)
  {
  USART_SendData(USART1, *p++);
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);   
  }   
   
  }
  USART_ClearITPendingBit(USART1, USART_IT_RXNE);
   
  }   
   

}
香水城 发表于 2012-3-24 14:52 | 显示全部楼层
查查配置。
logokfu 发表于 2012-3-25 01:47 | 显示全部楼层
算法问题,看看i和p应该是这个问题。
BigCat111 发表于 2012-3-25 11:25 | 显示全部楼层
static int i = 0;
static char rx[8];

void USART1_IRQHandler(void) {
   char RX;
   char *p;

   if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
      RX = USART_ReceiveData(USART1);
      rx[i++] = RX;
      if      (RX == 0xFE) i = 0;
      else if (RX == 0x16) {
         p = rx;
         while (i--) {
            USART_SendData(USART1, *p++);
            while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
         }
      }
      USART_ClearITPendingBit(USART1, USART_IT_RXNE);
   }
}
BigCat111 发表于 2012-3-25 11:28 | 显示全部楼层
你把 i,s申明为全局变量,就可以了,你的程序写的很乱,我把rx[8]也给你改成全局变量,别的函数可以访问,另外把s变量取消了
BigCat111 发表于 2012-3-25 11:32 | 显示全部楼层
rx[i++] = Rx,应该加上溢出判断,否则会出现崩溃,if (i < (sizeof(rx) -1)) rx[i++] = RX;
txcy 发表于 2012-3-25 12:09 | 显示全部楼层
应该是配置问题
love001cool 发表于 2012-6-11 15:32 | 显示全部楼层
1# hsbjb


楼主啊,我也想用PC给stm32发送16进制数,有好多问题请教,加我QQ276079932,谢谢啊
love001cool 发表于 2012-6-12 17:26 | 显示全部楼层
1# hsbjb

我也遇到童谣的问题了,楼主,加我啊,谢谢了,qq:181710348
lai832 发表于 2012-6-14 13:02 | 显示全部楼层
串行发的不是8位 0x00~0xff----0~255吗?有区别吗?8位就是16进制啊
yzzly 发表于 2012-6-14 14:39 | 显示全部楼层
应该是程序逻辑问题导致没有及时接收第一个字节
love001cool 发表于 2012-6-21 09:25 | 显示全部楼层
10# lai832

是的,是我搞错了,我想传的数字比255大了怎么办呢?是不是要拆分了发送啊?
luohui5003 发表于 2012-6-21 09:57 | 显示全部楼层
先等待再发送。你把下面两句调换一下位置就ok了!
USART_SendData(USART1, *p++);
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
luohui5003 发表于 2012-6-21 10:00 | 显示全部楼层
12# love001cool

发送大于255的数据,只需将数据拆分为高、低八位就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

193

主题

2354

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

193

主题

2354

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部