Linux之4G模块串口通信

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

在使用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
### 4G模块在物联网设备中的应用 对于物联网(IoT)设备而言,4G模块提供了一种可靠的蜂窝网络连接方式来传输数据。这类模块能够实现远程监控、控制以及与其他系统的交互操作等功能。 #### EC20模块特性及其适用场景 EC20是一款常见的4G LTE模块,适用于多种应用场景下的IoT解决方案[^1]。该模块不仅支持高速的数据通信,还兼容不同的操作系统环境,使得开发者可以灵活地将其集成到各种嵌入式系统之中。例如,在基于STM32F407微控制器的应用案例中展示了如何利用USB接口与EC20建立稳定连接并执行必要的初始化命令序列以完成基本设置[^5]。 #### 连接到云端服务 为了使这些设备能有效地参与到更大的生态系统当中去,通常还需要借助于特定的服务平台来进行管理和数据分析等工作。比如可以通过发送一系列预定义好的AT指令让EC20模块接入像华为云这样的第三方服务平台,并按照MQTT协议的要求订阅感兴趣的主题或者向指定位置推送消息。 #### 硬件选型考虑因素 当选择适合项目的4G模块时,除了性能指标外还需关注其他几个方面: - **电源需求**:确保所选用的4G模组能够在目标平台上获得适当的工作电压范围内的电力供应。例如,EC20芯片推荐的工作电压为3.88V左右,过低或过高都可能导致其运行不稳定甚至损坏硬件组件[^4]。 - **物理尺寸和接口类型**:考虑到最终产品的外形设计要求,应挑选那些具有合适大小及匹配I/O端子的产品型号。某些高性能计算平台如iTOP-3399开发板集成了丰富的外围资源(包括但不限于Wi-Fi, Bluetooth, Ethernet等),这有助于简化整体架构的设计过程同时提高可靠性[^3]. ```python import serial def send_at_command(command): ser = serial.Serial('/dev/ttyUSB0', baudrate=115200, timeout=1) ser.write((command + '\r\n').encode()) response = '' while True: line = ser.readline().decode('utf-8') if 'OK' in line or 'ERROR' in line: break response += line return response.strip() ``` 此Python脚本片段演示了怎样通过串行端口与4G模块交流,发送简单的AT命令并接收回应信息。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值