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

查看: 7040|回复: 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(&amp;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, &amp;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, &amp;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, &amp;USART_InitClockStructure); 
 
 
     USART_Init(EVAL_COM1, &amp;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-&gt;SRZ中
       {    
              res1 = USART_ReceiveData(USART2);
      
              if ('$' == res1)
              {
                     GPS_NEMA[NEMA_count].isupdated = 1; //将上面一条语句打上更新标志
                     NEMA_count++;
                    
                     if(NEMA_count &gt; (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 &lt; NEMA_CHAR_MAX)
                     {
                            GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
                     }
                    
                  if (USART_RX_STA &gt; 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 &lt; 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 &lt; NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
 

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

使用道具 举报

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