共2条
1/1 1 跳转至页
UART UART串口实验程序,大侠门都来参与参与!!!
问
本人做毕业设计是基于ARM7lpc2131的gps的接收与上传,接收gps的数据格式是
RMC指令
这有一程序是这样的
**函数名称:UART0_Init()
**函数功能:串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
**入口参数:无
**出口参数:无
******************************************************
void UART_Init(void)
{ uint16 Fdiv;
U0LCR=0x83; //DLAB=1,允许设置波特率
Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
/*****************************************************
但是我要接收的gps的数据又是这样的
$GPRMC,085056.996,A,4050.5602,N,11140.5101,E,000.0,172.8,250405,004.6,W*7A
请各位大侠帮帮忙,怎么样改改这段程序.
小生qq:308825966
emil:ysongzuishuai@163.com
多谢来参与!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!: 答 1: 对0813解码即可 答 2: 用队列来处理吧使用队列的处理方法,先把数据放在队列中,主程序解析协议。从上面的数据分析可以看出,$GPRMC, 为包头;逗号是分隔符号,也是处理数据的关键。程序中需要处理数值转换,因为串口传送的是二进制数,需要转换成你需要的格式。 答 3: 谢谢楼上的兄弟能不能说的再具体点,兄弟我现在一头雾水!请高手指教了. 答 4: ^-^,希望对你有帮助!
unsigned char Buf[BufMax];
unsigned char *p_In; //入数指针
unsigned char *p_Out; //取数指针
unsigned char m_Num; //缓冲区中的个数
//数据接收有p_In 处理,放在Buf
//解析:
static unsigned char Step=0;
static unsigned int Index=0;
if(m_Num)
{ //收到数据
m_Num --;
switch(Step)
{
case 0:
if(*p_Out == '$' ){ //收到开始符了
Step = 1;
Index=0;
}
p_Out ++;
break;
case 1: if( *(p_Out+Index) == ',')
{ //收到逗号
while(Index)
{ //把逗号中间的数据放在一个缓冲中,进行分析
*BufTemp ++ = *p_Out ++;
Index --;
}
//分析 :
if( '收到结束符 ' ) {Step=0; } //进行下一个循环
}
Index ++;
break;
default:
break;
}
} 答 5: 补充一下:如果数据量很大,m_Num应该定义为int 型,以上只是一个简单的框架,关键是
对 Index 和p_Out 指针的操作,否则容易丢数据;
同时在case 1:中,应该对Index 的数据进行限制,即
if(Index > XXXX){
Step=0; //是干扰,重新检测
} 答 6: 再补充:在实际中,应该注意指针的范围,即p_In ,p_Out 都应该 Buf[]范围内,
if(p_Out > Buf + BufMax ) p_Out = Buf;
对if( *(p_Out+Index) == ',') 改成:
char *p;
p = p_Out + Index;
if(p > Buf + BufMax) p = Buf;
if( *p == ',' )
不知道 对ysongsong 兄弟有无帮助?
答 7: 非常谢谢实在是太谢谢TRUE_ARM 了,我去调试一下,辛苦了,真希望能有很多象TRUE_ARM 这样的人,那么咱们做嵌入的人就都可以互相沟通了,也希望TRUE_ARM 等有知识的人能在ARM上飞起来.呵呵!!!!!!!!
RMC指令
这有一程序是这样的
**函数名称:UART0_Init()
**函数功能:串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
**入口参数:无
**出口参数:无
******************************************************
void UART_Init(void)
{ uint16 Fdiv;
U0LCR=0x83; //DLAB=1,允许设置波特率
Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
/*****************************************************
但是我要接收的gps的数据又是这样的
$GPRMC,085056.996,A,4050.5602,N,11140.5101,E,000.0,172.8,250405,004.6,W*7A
请各位大侠帮帮忙,怎么样改改这段程序.
小生qq:308825966
emil:ysongzuishuai@163.com
多谢来参与!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!: 答 1: 对0813解码即可 答 2: 用队列来处理吧使用队列的处理方法,先把数据放在队列中,主程序解析协议。从上面的数据分析可以看出,$GPRMC, 为包头;逗号是分隔符号,也是处理数据的关键。程序中需要处理数值转换,因为串口传送的是二进制数,需要转换成你需要的格式。 答 3: 谢谢楼上的兄弟能不能说的再具体点,兄弟我现在一头雾水!请高手指教了. 答 4: ^-^,希望对你有帮助!
unsigned char Buf[BufMax];
unsigned char *p_In; //入数指针
unsigned char *p_Out; //取数指针
unsigned char m_Num; //缓冲区中的个数
//数据接收有p_In 处理,放在Buf
//解析:
static unsigned char Step=0;
static unsigned int Index=0;
if(m_Num)
{ //收到数据
m_Num --;
switch(Step)
{
case 0:
if(*p_Out == '$' ){ //收到开始符了
Step = 1;
Index=0;
}
p_Out ++;
break;
case 1: if( *(p_Out+Index) == ',')
{ //收到逗号
while(Index)
{ //把逗号中间的数据放在一个缓冲中,进行分析
*BufTemp ++ = *p_Out ++;
Index --;
}
//分析 :
if( '收到结束符 ' ) {Step=0; } //进行下一个循环
}
Index ++;
break;
default:
break;
}
} 答 5: 补充一下:如果数据量很大,m_Num应该定义为int 型,以上只是一个简单的框架,关键是
对 Index 和p_Out 指针的操作,否则容易丢数据;
同时在case 1:中,应该对Index 的数据进行限制,即
if(Index > XXXX){
Step=0; //是干扰,重新检测
} 答 6: 再补充:在实际中,应该注意指针的范围,即p_In ,p_Out 都应该 Buf[]范围内,
if(p_Out > Buf + BufMax ) p_Out = Buf;
对if( *(p_Out+Index) == ',') 改成:
char *p;
p = p_Out + Index;
if(p > Buf + BufMax) p = Buf;
if( *p == ',' )
不知道 对ysongsong 兄弟有无帮助?
答 7: 非常谢谢实在是太谢谢TRUE_ARM 了,我去调试一下,辛苦了,真希望能有很多象TRUE_ARM 这样的人,那么咱们做嵌入的人就都可以互相沟通了,也希望TRUE_ARM 等有知识的人能在ARM上飞起来.呵呵!!!!!!!!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |