你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
USART接受数据时丢包
[复制链接]
xufengjuan
提问时间:2011-9-23 11:02 /
我使用串口调试助手向STM32的USART发送数据时,当波特率时115200时接受正常,当波特率时4800时就会发生丢后面的数据,丢的数据并不是固定长度,这是怎么回事?
赞
0
收藏
0
评论
4
分享
发布时间:2011-9-23 11:02
举报
请先
登录
后回复
4个回答
废鱼
回答时间:2011-9-23 14:49:50
a0a.1 0b0c
RE:USART接受数据时丢包
能不能把代码贴出来看看。可能是程序读取数据时候的问题。
赞
0
评论
回复
支持
反对
xufengjuan
回答时间:2011-9-23 16:07:05
a0a.1 0b0c
回复: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发表:
能不能把代码贴出来看看。可能是程序读取数据时候的问题。
赞
0
评论
回复
支持
反对
废鱼
回答时间:2011-9-23 16:59:40
a0a.1 0b0c
RE:USART接受数据时丢包
这个问题很可能是由于接收计数器小于缓冲区引起的。代码改成下面的:
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
赞
0
评论
回复
支持
反对
xufengjuan
回答时间:2011-9-24 15:40:14
a0a.1 0b0c
回复: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;
谢谢,按照你说的问题解决了
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
RE:USART接受数据时丢包
回复:USART接受数据时丢包
串口的初始化,选用的是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发表:
能不能把代码贴出来看看。可能是程序读取数据时候的问题。
RE:USART接受数据时丢包
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
回复:USART接受数据时丢包
这个问题很可能是由于接收计数器小于缓冲区引起的。代码改成下面的:
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
谢谢,按照你说的问题解决了