【驱动】05.UART子系统
UART 子系统
硬件原理
看硬件篇-接口协议
应用编程
串口协议包的接收及解析处理_c++串口解析_顶点元的博客-CSDN博客
实现串口通信数据帧打包与解析,串口通信可靠传输,屡试不爽的数据封包与状态机数据解析程序_串口通信数据包_简单|纯粹的博客-CSDN博客
基于状态机的串口通信 - quliuliu2013 - 博客园 (cnblogs.com)
对于UART,编程的套路就是:
- open
- 设置行规程,比如波特率、数据位、停止位、检验位、RAW模式、一有数据就返回
- read/write
例题1:GPS数据读取和解析
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh
$XXGGA语句各字段的含义和取值范围各字段的含义和取值范围见下表所示,XX取值有:
- GPGGA:单GPS
- BDGGA:单北斗
- GLGGA:单GLONASS
- GNGGA:多星联合定位
<1> | UTC时间hhmmss.ss | 000000.00~235959.99 |
<2> | 纬度,格式:ddmm.mmmm | 000.00000~8959.9999 |
<3> | 南北半球 | N北纬 S南纬 |
<4> | 经度格式dddmm.mmmm | 00000.0000~17959.9999 |
<5> | 东西半球 | E表示东经 W表示西经 |
<6> | GPS状态 | 0=未定位 1=GPS单点定位固定解 2=差分定位 3=PPS解 4=RTK固定解 5=RTK浮点解 6=估计值 7=手工输入模式 8=模拟模式 |
<7> | 应用解算位置的卫星数 | 00~12 |
<8> | HDOP 水平图形强度因子 | 0.500~99.000(大于6不可用) |
<9> | 海拔高度 | -9999.9~99999.9 |
地球椭球面相对大地水准面的高度 (高程异常) | -9999.9~99999.9 | |
<11> | 差分时间 | 从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空 |
<12> | 参考站号 | 0000~1023;不使用DGPS时为空 |
$GPGGA,074529.82,2429.6717,N,11804.6973,E,1,8,1.098,42.110,,,M,,*76。
int read_gps_raw_data(int fd, char *buf)
{
int i = 0;
int iRet;
char c;
int start = 0;
while (1)
{
iRet = read(fd, &c, 1);
if (iRet == 1)
{
if (c == '$')
start = 1;
if (start)
{
buf[i++] = c;
}
if (c == '\n' || c == '\r')
return 0;
}
else
{
return -1;
}
}
}
/* eg. $GPGGA,082559.00,4005.22599,N,11632.58234,E,1,04,3.08,14.6,M,-5.6,M,,*76"<CR><LF> */
int parse_gps_raw_data(char *buf, char *time, char *lat, char *ns, char *lng, char *ew)
{
char tmp[10];
if (buf[0] != '$')
return -1;
else if (strncmp(buf+3, "GGA", 3) != 0)
return -1;
else if (strstr(buf, ",,,,,"))
{
prin
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
【嵌入式八股】嵌入式Linux 文章被收录于专栏
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇 4.嵌入式Linux【本专栏】 (建议PC端查看)