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

查看: 7037|回复: 4

USART接受数据时丢包

[复制链接]

13

主题

23

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2011-9-23 11:02:35 | 显示全部楼层 |阅读模式
我使用串口调试助手向STM32的USART发送数据时,当波特率时115200时接受正常,当波特率时4800时就会发生丢后面的数据,丢的数据并不是固定长度,这是怎么回事?
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-9-23 14:49:50 | 显示全部楼层

RE:USART接受数据时丢包

能不能把代码贴出来看看。可能是程序读取数据时候的问题。
回复 支持 反对

使用道具 举报

13

主题

23

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2011-9-23 16:07:05 | 显示全部楼层

回复:USART接受数据时丢包

串口接收GPS信号
 
串口的初始化,选用的是USART2
void wvGPS_init(void)
{
       GPIO_InitTypeDef GPIO_InitStructure;
       USART_InitTypeDef USART_InitStructure;
       NVIC_InitTypeDef NVIC_InitStructure;
       USART_ClockInitTypeDef USART_InitClockStructure;
 
       NVIC_InitStructure.NVIC_IRQChannel = EVAL_COM1_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);
 
       RCC_AHB1PeriphClockCmd(EVAL_COM1_TX_GPIO_CLK|EVAL_COM1_RX_GPIO_CLK, ENABLE);
       RCC_APB1PeriphClockCmd(EVAL_COM1_CLK, ENABLE);
 
       GPIO_PinAFConfig(EVAL_COM1_TX_GPIO_PORT,EVAL_COM1_TX_SOURCE,EVAL_COM1_TX_AF);
       GPIO_PinAFConfig(EVAL_COM1_RX_GPIO_PORT,EVAL_COM1_RX_SOURCE,EVAL_COM1_RX_AF);
       //TX
       GPIO_InitStructure.GPIO_Pin = EVAL_COM1_TX_PIN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
       GPIO_Init(EVAL_COM1_TX_GPIO_PORT, &GPIO_InitStructure);
       //RX
       GPIO_InitStructure.GPIO_Pin = EVAL_COM1_RX_PIN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
       GPIO_Init(EVAL_COM1_RX_GPIO_PORT, &GPIO_InitStructure);
      
       USART_InitStructure.USART_BaudRate            = 4800;
     USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
     USART_InitStructure.USART_StopBits            = USART_StopBits_1;
     USART_InitStructure.USART_Parity              = USART_Parity_No;
     USART_InitStructure.USART_Mode          = USART_Mode_Rx|USART_Mode_Tx;
 USART_InitStructure.USART_HardwareFlowContro= USART_HardwareFlowControl_None;
 
    USART_InitClockStructure.USART_CPOL    = USART_CPOL_Low;
    USART_InitClockStructure.USART_CPHA    = USART_CPHA_2Edge;
    USART_InitClockStructure.USART_LastBit = USART_LastBit_Disable;
    USART_InitClockStructure.USART_Clock   = USART_Clock_Disable;
    USART_ClockInit(USART2, &USART_InitClockStructure); 
 
 
     USART_Init(EVAL_COM1, &USART_InitStructure);
     USART_Cmd(EVAL_COM1, ENABLE); //enable USART2
 
       USART_ITConfig(EVAL_COM1, USART_IT_RXNE, ENABLE); //开USART2的接收中断
}
 
接收数据程序
void wvGPS_usart(void)
{
       char res1;
    static int8u NEMA_count = 0;    //接收GPS数据的条数
       static int8u USART_RX_STA = 0;       //接收状态标记  
 
       if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)//接收到数据 RXNE 位,USART->SRZ中
       {    
              res1 = USART_ReceiveData(USART2);
      
              if ('$' == res1)
              {
                     GPS_NEMA[NEMA_count].isupdated = 1; //将上面一条语句打上更新标志
                     NEMA_count++;
                    
                     if(NEMA_count > (NEMA_NUM_MAX-1))
                     {
                            NEMA_count = 0;
                     }
                    
                     GPS_NEMA[NEMA_count].isupdated = 0; //将本条语句打上未更新标志
                     GPS_NEMA[NEMA_count].buffer[0] = '$';
                     USART_RX_STA = 1;
              }
              else
              {
            if (USART_RX_STA < NEMA_CHAR_MAX)
                     {
                            GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
                     }
                    
                  if (USART_RX_STA > NEMA_CHAR_MAX-1) // 
                            USART_RX_STA=0;
              }
   }
    }
 
中断程序
void USART2_IRQHandler(void)
{
   wvGPS_usart();
 
}
有时会把字符“*”接收为“0x2A”有时候就是0,别的字符没发现错误
回复第 2 楼 于2011-09-23 06:49:50发表:
能不能把代码贴出来看看。可能是程序读取数据时候的问题。
 

 
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-9-23 16:59:40 | 显示全部楼层

RE:USART接受数据时丢包

这个问题很可能是由于接收计数器小于缓冲区引起的。代码改成下面的:
  if (USART_RX_STA < NEMA_CHAR_MAX)
                     {
                            GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
                     }
else
                 USART_RX_STA=0;
回复 支持 反对

使用道具 举报

13

主题

23

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2011-9-24 15:40:14 | 显示全部楼层

回复:USART接受数据时丢包

回复第 4 楼 于2011-09-23 08:59:40发表:
这个问题很可能是由于接收计数器小于缓冲区引起的。代码改成下面的:
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
 

谢谢,按照你说的问题解决了
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版