工控硬件通信基础:串口 RS232/485、I2C、SPI 用户层读写实操
工控硬件通信基础串口 RS232/485、I2C、SPI 用户层读写实操搞工控不会跟硬件说话怎么行这篇带你从串口到 I2C 再到 SPI把用户层读写一次性撸明白。一、工控常用硬件接口总览工控场景下主板和各种外设之间靠的是各种硬件接口协议。常见的有这几种接口通信方式线数典型场景速率RS232点对点全双工3线TX/RX/GND调试串口、GPS模块115200bps常见RS485多点半双工2线A/BModbus总线、工业仪表10Mbps理论值I2C多主多从2线SCL/SDA温湿度传感器、EEPROM100kHz~3.4MHzSPI主从全双工4线SCLK/MOSI/MISO/CSADC、显示屏、Flash几十MHzCAN多主差分2线CAN_H/CAN_L汽车电子、运动控制1Mbps选型逻辑很简单短距离调试用串口工业总线用485或CAN板级传感器用I2C高速外设用SPI。二、串口通信基础2.1 RS232 vs RS485RS232单端信号点对点通信传输距离短一般15米以内常见的DB9串口就是它。工控机上调试口基本都用RS232。RS485差分信号多点通信一条总线上可以挂多个设备最多32个标准节点传输距离可达1200米。工业现场传感器、变频器、电表大多走485总线。两者电气特性不同但传输的数据帧格式完全一样——都是 UART 帧起始位数据位校验位停止位。所以从软件角度看编程方式一模一样区别只在硬件层。2.2 串口参数配置串口通信需要收发双方约定好以下参数否则收到的是乱码波特率通信速率常见9600、19200、38400、115200数据位5/6/7/8 位常用8位校验位None无校验、Even偶校验、Odd奇校验停止位1位或2位常用1位三、Linux 串口编程3.1 打开串口设备Linux 下串口设备节点为/dev/ttyS*传统串口或/dev/ttyUSB*USB转串口。intfdopen(/dev/ttyS0,O_RDWR|O_NOCTTY|O_NDELAY);if(fd0){perror(open serial failed);return-1;}// 恢复阻塞模式fcntl(fd,F_SETFL,0);O_NOCTTY不把串口设为控制终端O_NDELAY不等待DCD信号打开后可用fcntl恢复阻塞3.2 termios 结构体配置Linux 串口配置的核心是termios结构体#includetermios.hstructtermiosoptions;tcgetattr(fd,options);// 获取当前配置// 设置波特率cfsetispeed(options,B115200);cfsetospeed(options,B115200);// 设置数据位8位options.c_cflag~CSIZE;options.c_cflag|CS8;// 设置校验位无校验options.c_cflag~PARENB;options.c_cflag~CSTOPB;// 1位停止位// 使能接收和本地模式options.c_cflag|(CLOCAL|CREAD);// 关闭软件流控options.c_iflag~(IXON|IXOFF|IXANY);// 原始模式输出options.c_oflag~OPOST;// 原始模式输入不做特殊处理options.c_lflag~(ICANON|ECHO|ECHOE|ISIG);// 设置超时读取1个字符后等待100msoptions.c_cc[VMIN]1;// 最少读取1个字符options.c_cc[VTIME]1;// 超时0.1秒tcsetattr(fd,TCSANOW,options);// 立即生效3.3 数据收发配置好后直接用read/write就行// 发送数据chartx_buf[]Hello;intnwrite(fd,tx_buf,sizeof(tx_buf));// 接收数据charrx_buf[256];nread(fd,rx_buf,sizeof(rx_buf));if(n0){printf(Received %d bytes: %s\n,n,rx_buf);}注意RS485是半双工发送前要切换收发方向。有些硬件通过RTS引脚控制ioctl(fd, TIOCMSET, ...)具体看硬件手册。四、I2C 用户层操作4.1 i2c-tools 工具集Linux 提供了i2c-tools工具包先装上sudoaptinstalli2c-tools常用命令# 查看总线列表i2cdetect-l# 扫描i2c-1总线上的设备地址0x03~0x77i2cdetect-y1# 读取总线1上地址0x48的设备寄存器0x00的值i2cget-y10x48 0x00# 向总线1上地址0x48的设备寄存器0x01写入值0x55i2cset-y10x48 0x01 0x554.2 C 程序读取 I2C 传感器以 SHT30 温湿度传感器为例地址0x44总线1#includefcntl.h#includelinux/i2c-dev.h#includesys/ioctl.h#includeunistd.h#includestdint.hintread_sht30(float*temp,float*humi){intfdopen(/dev/i2c-1,O_RDWR);if(fd0)return-1;// 设置从设备地址if(ioctl(fd,I2C_SLAVE,0x44)0){close(fd);return-1;}// 发送测量命令单次高精度测量 0x2400uint8_tcmd[2]{0x24,0x00};if(write(fd,cmd,2)!2){close(fd);return-1;}usleep(15000);// 等待测量完成// 读取6字节数据温度高/低/CRC 湿度高/低/CRCuint8_tdata[6];if(read(fd,data,6)!6){close(fd);return-1;}close(fd);// 转换uint16_traw_t(data[0]8)|data[1];uint16_traw_h(data[3]8)|data[4];*temp-45.0175.0*raw_t/65535.0;*humi100.0*raw_h/65535.0;return0;}I2C 读写流程open→ioctl(I2C_SLAVE)设地址 →write发命令 →read读数据。就这么简单。五、SPI 用户层操作5.1 spidev 设备节点SPI 设备节点为/dev/spidevX.YX为总线号Y为片选号。使用前需在设备树中使能 spidev。5.2 ioctl 传输数据SPI 是全双工通过ioctl(fd, SPI_IOC_MESSAGE(1), transfer)一次完成收发#includelinux/spi/spidev.h#includefcntl.h#includesys/ioctl.h#includeunistd.hintspi_transfer(intfd,uint8_t*tx,uint8_t*rx,intlen){structspi_ioc_transfertr{.tx_buf(unsignedlong)tx,.rx_buf(unsignedlong)rx,.lenlen,.delay_usecs0,.speed_hz1000000,// 1MHz.bits_per_word8,};returnioctl(fd,SPI_IOC_MESSAGE(1),tr);}intmain(){intfdopen(/dev/spidev0.0,O_RDWR);uint8_tmodeSPI_MODE_0;ioctl(fd,SPI_IOC_WR_MODE,mode);uint8_ttx[]{0xAA,0xBB,0xCC};uint8_trx[3]{0};spi_transfer(fd,tx,rx,3);// rx中即为接收到的数据close(fd);return0;}关键点SPI 传输时 MOSI 和 MISO 同时工作发一个字节的同时收一个字节。想只读不写tx 填0x00 即可。六、完整串口配置收发代码把前面的串口部分整合成一个可直接用的模块#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includefcntl.h#includetermios.h#includeerrno.hintserial_open(constchar*dev,intbaudrate){intfdopen(dev,O_RDWR|O_NOCTTY|O_NDELAY);if(fd0){perror(open failed);return-1;}fcntl(fd,F_SETFL,0);structtermiosopt;tcgetattr(fd,opt);speed_tspeed;switch(baudrate){case9600:speedB9600;break;case19200:speedB19200;break;case38400:speedB38400;break;case115200:speedB115200;break;default:speedB115200;break;}cfsetispeed(opt,speed);cfsetospeed(opt,speed);opt.c_cflag~CSIZE;opt.c_cflag|CS8;opt.c_cflag~PARENB;opt.c_cflag~CSTOPB;opt.c_cflag|(CLOCAL|CREAD);opt.c_iflag~(IXON|IXOFF|IXANY);opt.c_oflag~OPOST;opt.c_lflag~(ICANON|ECHO|ECHOE|ISIG);opt.c_cc[VMIN]1;opt.c_cc[VTIME]10;// 1秒超时tcsetattr(fd,TCSANOW,opt);tcflush(fd,TCIFLUSH);returnfd;}intmain(){intfdserial_open(/dev/ttyS0,115200);if(fd0)return-1;// 发送constchar*msgAT\r\n;write(fd,msg,strlen(msg));// 接收charbuf[256];intnread(fd,buf,sizeof(buf)-1);if(n0){buf[n]\0;printf(RX: %s\n,buf);}close(fd);return0;}编译gcc serial.c -o serial运行前确认有串口读写权限或加sudo。七、工控常见传感器/外设通讯参数汇总设备类型典型型号接口参数温湿度传感器SHT30/SHT40I2C地址0x44115200无需温湿度传感器AM2302单总线GPIO压力传感器BMP280I2C/SPI地址0x76/0x77光照传感器BH1750I2C地址0x23土壤湿度RS485型RS4859600, 8N1, Modbus-RTU变频器汇川/台达RS4859600/19200, 8E1, Modbus-RTU电表DDS系列RS4852400, 8N1, Modbus-RTUADCMCP3208SPI1MHz, MODE0继电器模块通用RS4859600, 8N1GPS模块ATGM336HUART9600, 8N1八、小结工控硬件通信的本质就是约定好协议格式然后通过设备节点收发字节。串口/dev/ttyS* termios 配置 read/writeI2C/dev/i2c-* ioctl 设地址 read/writeSPI/dev/spidev* ioctl 传输三条路径套路一致打开设备节点 → 配置参数 → 收发数据。搞懂这个模式换什么外设都能快速上手。

相关新闻

systemd工控服务开发:常驻程序、开机自启、异常自动重启、多服务依赖管理

systemd工控服务开发:常驻程序、开机自启、异常自动重启、多服务依赖管理

systemd工控服务开发:常驻程序、开机自启、异常自动重启、多服务依赖管理init.d那套启动脚本像手工裁缝——每个服务一个脚本,写法各不相同,出了问题得翻壳脚本找bug。systemd像流水线工厂——统一格式、统一管理、日志自带、依赖编排。工控时…

2026/7/24 2:02:29阅读更多 →
工控必备Shell脚本开发:自动挂载、日志归档、看门狗、程序守护脚本

工控必备Shell脚本开发:自动挂载、日志归档、看门狗、程序守护脚本

工控必备Shell脚本开发:自动挂载、日志归档、看门狗、程序守护脚本工控设备没有人在旁边盯着,出问题得自己修自己扛。Shell脚本就是工控系统的"瑞士军刀"——挂磁盘、管日志、喂狗、保活,一个脚本搞定一个活。一、Shell脚本在工控中…

2026/7/24 2:02:29阅读更多 →
Gemini 3.6 Flash与3.5 Flash Lite:轻量级AI模型选型与API实战指南

Gemini 3.6 Flash与3.5 Flash Lite:轻量级AI模型选型与API实战指南

在 AI 大模型快速迭代的背景下,Google 近期推出了 Gemini 系列的两个新成员:Gemini 3.6 Flash 和 Gemini 3.5 Flash Lite。这两个模型并非追求极致性能的旗舰版本,而是针对特定场景优化的轻量级解决方案,尤其强调在成本、响应速度…

2026/7/24 2:02:29阅读更多 →
CTF 比赛到底怎么打,新手入门题型解析与备赛策略

CTF 比赛到底怎么打,新手入门题型解析与备赛策略

为什么 CTF 是新手实战的最佳起点对于刚踏入网络安全领域的新手来说,最大的痛点往往不是“学不会”,而是“没处练”。现实中的渗透测试有着严格的法律边界和复杂的业务流程,初学者很难在合法合规的前提下找到合适的靶场进行深度演练。而 CTF&…

2026/7/24 3:35:01阅读更多 →
SLA稀疏注意力机制:视频生成计算效率革命

SLA稀疏注意力机制:视频生成计算效率革命

1. 项目背景与核心价值 视频生成领域近年来取得了显著进展,但计算成本高企一直是制约其广泛应用的主要瓶颈。传统注意力机制在视频生成任务中需要处理三维时空数据,导致计算复杂度呈立方级增长。以典型的256帧视频生成为例,全连接注意力层的计…

2026/7/24 3:35:01阅读更多 →
GEN-1通用AI技术解析:动态架构与人类数据训练

GEN-1通用AI技术解析:动态架构与人类数据训练

1. GEN-1技术突破的核心价值上周在实验室第一次跑通GEN-1测试集时,看着控制台不断刷新的99%准确率,我对着屏幕发了五分钟呆。这个数字意味着什么?从业十年见过太多"在特定任务表现优异"的AI系统,但能在通用任务上稳定输…

2026/7/24 3:35:01阅读更多 →
网安面试题库大公开,大厂高频考点与解题思路复盘

网安面试题库大公开,大厂高频考点与解题思路复盘

大厂网安面试核心考点拆解网络安全岗位的面试,尤其是面对深信服、奇安信这类头部厂商时,往往不再是简单的概念背诵,而是一场对技术深度、实战思维以及应急反应能力的综合大考。对于应届生或转行朋友来说,手里握着厚厚的学习资料却…

2026/7/24 3:35:01阅读更多 →
零基础转行网安,2026 最新学习路线与资源清单

零基础转行网安,2026 最新学习路线与资源清单

为什么选择现在转行网安?对于许多身处运维或开发岗位的朋友来说,2026 年的职场环境既充满挑战也蕴含机遇。传统的 IT 基础设施维护工作正逐渐被自动化和云原生架构取代,单纯的开发技能若缺乏安全视角,往往在职业晋升中遇到瓶颈。与…

2026/7/24 3:35:01阅读更多 →
提示工程ROI评估框架与实践指南

提示工程ROI评估框架与实践指南

1. 提示工程ROI评估的核心框架在人工智能应用领域,提示工程(Prompt Engineering)已经从单纯的技巧演变为影响项目成败的关键因素。但很多团队在投入提示工程优化时,常常陷入"投入越多效果越好"的误区,缺乏系…

2026/7/24 3:32:58阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →