串口linux开发实践分享 (串口linux)

串口Linux开发实践分享

随着科技的发展,串口通信的应用越来越广泛,特别是在工业自动化、智能家居、电子产品等领域。串口通信的开发工作需要在Linux系统下进行,但是Linux系统上各种开发环境繁多,如何选择合适的工具和方法进行开发,是开发人员需要考虑的重要问题。本文将分享我在串口Linux开发实践中的经验和心得。

1、串口概述

串口是计算机和外部设备之间进行通信的一种方式。串口通信可以使用RS-232、RS-485、USB等不同的协议。串口通信具有数据传输速度慢、传输距离短、信息传输稳定可靠等特点,因此被广泛应用。

2、串口Linux开发环境搭建

2.1 嵌入式Linux开发环境

需要开发嵌入式Linux系统,选择适合的开发环境非常重要。嵌入式Linux主要集成了Linux内核、文件系统、libc等组件。这里我们推荐使用OpenWrt开源操作系统,其特点是小巧、灵活、易于定制,可运行于各种嵌入式设备上。使用OpenWrt开发和调试串口应用非常方便。

2.2 Linux深度开发环境

如果开发应用层的串口程序,我们推荐使用广泛应用的编译器gcc和调试工具gdb。这些工具支持C、C++等多种编程语言,并能够很好地支持Linux操作系统。另外,如有需要也可以选择Qt Creator、Eclipse等综合性开发环境。

3、串口Linux开发实践

3.1 串口开发基础

在进行串口开发之前,我们需要掌握以下几个基本知识:

(1)Linux系统中串口设备文件的命名规则为“/dev/tty*”。

(2)需要使用“open”函数打开串口设备,使用“read”和“write”函数实现串口读写。

(3)通过“ioctl”函数设置串口参数,如波特率、数据位、奇偶校验位等。

3.2 串口开发实例

下面我们以一个简单的串口通信程序为例来说明如何进行串口开发。

#include

#include

#include

#include

#include

#include

int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)

{

struct termios newtio, oldtio;

if ( tcgetattr( fd, &oldtio ) != 0 )

{

perror(“tcgetattr”);

return -1;

}

bzero( &newtio, sizeof( newtio ) );

newtio.c_cflag |= CLOCAL | CREAD;

newtio.c_cflag &= ~CSIZE;

switch ( nBits )

{

case 7:

newtio.c_cflag |= CS7;

break;

case 8:

newtio.c_cflag |= CS8;

break;

}

switch ( nEvent )

{

case ‘O’:

newtio.c_cflag |= PARENB;

newtio.c_cflag |= PARODD;

newtio.c_iflag |= ( INPCK | ISTRIP );

break;

case ‘E’:

newtio.c_iflag |= ( INPCK | ISTRIP );

newtio.c_cflag |= PARENB;

newtio.c_cflag &= ~PARODD;

break;

case ‘N’:

newtio.c_cflag &= ~PARENB;

break;

}

switch ( nSpeed )

{

case 2400:

cfsetispeed( &newtio, B2400 );

cfsetospeed( &newtio, B2400 );

break;

case 4800:

cfsetispeed( &newtio, B4800 );

cfsetospeed( &newtio, B4800 );

break;

case 9600:

cfsetispeed( &newtio, B9600 );

cfsetospeed( &newtio, B9600 );

break;

case 115200:

cfsetispeed( &newtio, B115200 );

cfsetospeed( &newtio, B115200 );

break;

default:

cfsetispeed( &newtio, B9600 );

cfsetospeed( &newtio, B9600 );

break;

}

if ( nStop == 1 )

{

newtio.c_cflag &= ~CSTOPB;

}

else if ( nStop == 2 )

{

newtio.c_cflag |= CSTOPB;

}

newtio.c_cc[VTIME] = 0;

newtio.c_cc[VMIN] = 0;

tcflush( fd, TCIFLUSH );

if ( tcsetattr( fd, TCSANOW, &newtio ) != 0 )

{

perror(“tcsetattr”);

return -1;

}

return 0;

}

int mn(void)

{

int fd;

int nread;

char buf[1024] = {0};

fd = open(“/dev/ttyAMA0”,O_RDWR);

if(fd == -1 )

{

perror(“open”);

return -1;

}

set_opt(fd, 115200, 8, ‘N’, 1);

while(1)

{

nread = read(fd, buf, 1024);

if(nread > 0)

{

printf(“recv:%s\n”, buf);

}

}

close(fd);

return 0;

}

这段程序实现了打开串口设备“/dev/ttyAMA0”并设置波特率为115200、数据位为8、无奇偶校验位、停止位为1。然后读取串口发送的数据,并在终端上输出。

4、

相关问题拓展阅读:

  • Linux串口调试工具–minicom
  • Linux下串口通信丢字节的问题是怎么样解决

Linux串口调试工具–minicom

安装完成后,请氏神不要着急打开软件。需先进行配置。具体步骤如下:

查看串口设备及文件权限

linux下的所有操作面向用户的都是文件操作,在对串口操作之前,我们应该先确认自己对该文件有没有读写权限。

linux下的u串口命名为ttyUSB*,运行上面命令,可以看到有几个设备挂载。

我们这里是:

只有ttuUSB0.再用lsu查看:

u 004正是我们挂上去的u转串口线缆,使用的芯片是PL2303。

但是正如上面显示,ttyUSB0这个设备是root所有的,所以,我们以普通用户身份打开minicom是没法访问该文件的。

运行sudo minicom -s便进入了minicom的配置界面,使用上下键选择Serial port setup,回车。此时光标在“change which setting”后面停留,它的上面有如下菜单:

我们只需输入上面对穗核哪应的字母,就可以进如相应的菜单进行设置。设置完成,回车,光标会回到“change which setting”后面,如此重复。完成按回车返回主菜单即可。

返回主菜单后,选择“Save setup as df1”,将其保存为默认设置,然后选择 Exit退出。需退出后重新打开minicom,软件才会使用上述参数进行初始化。

注意:如果没有使用USB转串口,而是直接使用串口,那么Serial Device要配置为/dev/ttyS0。

如果上面设置顺利,打开minicom

重新给设备上电后,此时,窗口里就有信息打印出来了。

1)需使用Ctrl+a 进入设置状态

2)按z进入设置菜单

(1)O键:打开配置选项;

(2)W键:自动卷屏。当显示的内容超过一行之後,自动将後面的内容换行。这个功能在查看内核的启动信息时很有用。

(3)C键:清除屏幕的显示内容;

(4)B键:浏览minicom的历史显示;

(5)X键:退出minicom,会提示确认退出。

Ctrl + A –> O

选择”Filenames and paths”

更多的参数,参见”man minicom”的输出。

如果不加这个项,那么在minicom和pc交互的时候中键入命令超过一行时候会被截断,(这时候可以通过 w 来开和关切换截断行功能).

这样,启动之后我们会发现显示的内容不是黑白的了。

这样,启动之后,所在minicom的输出都会在中保留一份,如果原来文件存在,则追加,不存在猜码则创建一个。

这样,我们可以取代用 * 发送命令的方式,将 替换成 或者 .

这里,是你的脚本文件的名字,应该指定绝对路径,否则就会在你启动minicom的路径下寻找。

Minicom是基于窗口的。要弹出所需功能的窗口,可按下 Ctrl-A (以下使用C-A来表示Ctrl-A),然后再按各功能键(a-z或A-Z)。先按C-A,再按’z’,将出现一个帮助窗口,提供了所有命令的简述。配置 minicom(-s 选项,或者C-A、O)时,可以改变这个转义键,不过现在我们还是用Ctrl-A吧。

这里,只给出很少的命令,更多的交互命令参见” z”的帮助输出。

minicom -s 或启动minicom之后运行 o 来进行配置。

C:脚本文件的存放位置: g 运行脚本时的路径 。

D:选择脚本程序: 默认 runscript ,也可以选择 bash 脚本格式。

可以参考man手册 man runscript .交互命令中可以运行” G “来运行脚本。

参考资料

Linux下串口通信丢字节的问题是怎么样解决

int con=atoi(portstr);

unsigned char Port_file_name;

int fd0,rc;

struct termios ts0;

switch (con)

{ //选项O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信息将影响程序的执行

//O_NDELAY表示瞎判打开串口的时候,程序并不关心另一端悔则的串口是否在使用中

case 1: fd0=open(“/dev/ttyM0”,O_RDWR | O_NOCTTY | O_NDELAY); break;

case 2: fd0=open(“/dev/ttyM1”,O_RDWR | O_NOCTTY | O_NDELAY); break;

case 3: fd0=open(“/dev/ttyM2”,O_RDWR | O_NOCTTY | O_NDELAY); break;

case 4: fd0=open(“/dev/ttyM3”,O_RDWR | O_NOCTTY | O_NDELAY); break;

case 5: fd0=open(“/dev/ttyM4”,O_RDWR | O_NOCTTY | O_NDELAY); break;

case 6: fd0=open(“/dev/ttyM5”,O_RDWR | O_NOCTTY | O_NDELAY); break;

case 7: fd0=open(“/dev/ttyM6”,O_RDWR | O_NOCTTY | O_NDELAY); break;

case 8: fd0=open(“/dev/ttyM7”,O_RDWR | O_NOCTTY | O_NDELAY); break;

default : fd0=open(“/dev/ttyM0”,O_RDWR | O_NOCTTY | O_NDELAY); break;

}

tcgetattr(fd0,&ts0);

bzero(&ts0,sizeof(struct termios));

switch (gytype)

{

case 1:{ts0.c_cflag |= B300 | CS7 | CLOCAL | CREAD | PARENB ;

ts0.c_cflag &= ~PARODD; // 转换为偶效验

ts0.c_iflag |= INPCK; // Disnable parity checking

break; }

case 2:{ts0.c_cflag |= B1200 | CS8 | CLOCAL | CREAD | PARENB ;

ts0.c_cflag &= ~PARODD; //磨前改 转换为偶效验

ts0.c_iflag |= INPCK; // Disnable parity checking

break;

}

case 3:{

ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD ;

ts0.c_cflag &= ~PARENB; // Clear parity enable

ts0.c_iflag &= ~INPCK; // Enable parity checking

break;

}

case 4:{ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD | PARENB ;

ts0.c_cflag &= ~PARODD; // 转换为偶效验

ts0.c_iflag |= INPCK; // Disnable parity checking

break;

}

}

ts0.c_lflag &= ~ECHO;

ts0.c_lflag &= ~ECHONL;

ts0.c_iflag &= ~IXOFF;

ts0.c_iflag &= ~IXON;

ts0.c_cflag &= ~CSIZE;

switch (gytype)

{

case 1:{ts0.c_cflag |= CS7 ; break;}

case 2:{ts0.c_cflag |= CS8 ; break;}

case 3:{ts0.c_cflag |= CS8 ; break;}

case 4:{ts0.c_cflag |= CS8 ; break;}

}

ts0.c_lflag &= ~ICANON; //如果设置使能规范输入,否则使用原始数据(本文使用)

ts0.c_oflag &= ~ONLCR; //如果设置将NL转换成CR-NL后输出

ts0.c_iflag &= ~INLCR; //如果设置将接收到的NL(换行)转换成CR(回车)。

ts0.c_cc = 0; //最少可读数据

ts0.c_cc = 0; //等待数据时间(10秒的倍数)

ts0.c_cflag &= ~CSTOPB; //如果设置则使用两个停止位 ,如果取消则使用一个停止位

ts0.c_iflag |= IGNBRK; //如果设置则忽略接收到的break信号

ts0.c_lflag &= ~IEXTEN; //如果设置则启用实现自定义的输入处理

ts0.c_lflag |= NOFLSH; //如果设置则禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列

switch (gytype)

{

case 1:{rc = cfsetospeed(&ts0,B300);break; }

case 2:{rc = cfsetospeed(&ts0,B1200);break; }

case 3:{rc = cfsetospeed(&ts0,B9600);break; }

case 4:{rc = cfsetospeed(&ts0,B9600);break; }

}

rc = tcsetattr(fd0,TCSAFLUSH,&ts0);

串口linux的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于串口linux,串口linux开发实践分享,Linux串口调试工具–minicom,Linux下串口通信丢字节的问题是怎么样解决的信息别忘了在本站进行查找喔。

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/173938.html<

(0)
运维的头像运维
上一篇2025-03-24 00:41
下一篇 2025-03-24 00:42

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注