在使用AT指令给4G模块发信息的时候,我们需要借助到Linux中busybox的microcom工具,该工具用来实现与串口之间的通信,那怎么自己实现编程跟4G模块发信息,以及接收信息把想要的信息放入结构体呢?
编程思想:
在/dev下找到4G模块的设备描述符,然后按照“Linux一切皆文件”的思想,打开这个设备,初始化串口配置后,用write发送AT的指令给4G模块通信,然后用read接收,再把接收到想要的数据分割出来放到结构体里面去。
1.在/dev下找到4G模块的设备描述符,我的是/dev/ttyACM2

2.打开这个设备
//deviceName --/dev/ttyACM2
//O_NOCTTY 如果打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
//O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
gg_G4_INFO->deviceFd = open(gg_G4_INFO->deviceName,O_RDWR | O_NOCTTY | O_NONBLOCK);
if(gg_G4_INFO->deviceFd < 0)
{
printf("Open %s failed,fd=%d\n",gg_G4_INFO->deviceName,gg_G4_INFO->deviceFd);
goto EXIT;
}
// 检查串口是否处于阻塞态
if((retval = fcntl(gg_G4_INFO->deviceFd,F_SETFL,0)) < 0)
{
printf("%s,Fcntl check faile.\n",__func__);
goto EXIT;
}
}
3.初始化串口
一些函数介绍:
为了便于通过程序来获得和修改终端参数,Linux还提供了tcgetattr函数和tcsetattr函数。tcgetattr用于获取终端的相关参数,而tcsetattr函数用于设置终端参数。
<termios.h>
1.tcgetattr函数:
函数原型:int tcgetattr(int fd, struct termios *termios_p);
功能:
tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios 结构体中
其成员:
tcflag_t c_iflag; //输入模式标志,控制终端输入方式
tcflag_t c_oflag; //输出模式标志,控制终端输出方式
tcflag_t c_cflag; //控制模式标志,指定终端硬件控制信息
tcflag_t c_lflag; //本地模式标志,控制终端编辑功能
cc_t c_cc[NCCS]; //控制字符,用于保存终端驱动程序中的特殊字符,如输入结束符等
返回值:成功返回 0,失败返回 -1
2.tcsetattr函数:
函数原型:int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
功能:
tcsetattr函数用于设置终端参数。函数在成功的时候返回0,失败的时候返回-1,并设置errno的值。
参数fd为打开的终端文件描述符,参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数。optional_actions可以取如下的值。
TCSANOW:不等数据传输完毕就立即改变属性。
TCSADRAIN:等待所有数据传输结束才改变属性。
TCSAFLUSH:等待所有数据传输结束,清空输入输出缓冲区才改变属性。
错误信息:
EBADF:非法的文件描述符。
EINTR:tcsetattr函数调用被信号中断。
EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值。
ENOTTY:非终端的文件描述符。
3.strerror()函数
原型:char * strerror(int errnum);
函数说明:strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串指针返回.
返回值:返回描述错误原因的字符串指针.
功能:获取指向错误消息字符串的指针
4.isatty()函数
功能:检查设备类型,判断文件描述词是否为终端机
头文件:<io.h>
原型:int isatty(int handle);
参数:int handle 为要检查的设备文件句柄
返回值:如果参数desc所代表的文件描述词为一终端机则返回1,否则返回0
int decive_init(G4_INFO **g_G4_INFO)
{
G4_INFO *gg_G4_INFO = *g_G4_INFO;
if

本文详细介绍了如何在Linux环境下,通过编程方式实现与4G模块的串口通信。首先,找到4G模块在/dev下的设备描述符,如/dev/ttyACM2,然后使用open函数以非阻塞方式打开设备。接着,利用tcgetattr和tcsetattr函数初始化串口参数,包括设置波特率、数据位、校验位和停止位等。在初始化完成后,通过write和read函数发送AT指令并接收响应。程序中还包含了错误处理和数据接收的逻辑,确保通信的稳定进行。
最低0.47元/天 解锁文章
7295





