前段时间写过串口通信方面的,时间久了就忘记了,也没做总结,今天又要面临这个问题,于是便把它的实现写下来,今天主要写一写RS232继电器的串口通信。
首先要设置串口,然后再做发送和接收的操作,不同的设备对串口的处理不同,当你需要想某个设备的串口输入数据时,你需要弄清它的串口处理,这里主要看相应设备的文档。
我的继电器使用的MODBUS-RTU协议。
设置串口:串口传输的数据为——波特率、数据位、奇偶校验位、停止位,串口设置中用到的重要数据是struct termios;结构体
1.termios结构体
struct termios
{
unsigned short c_iflag; //输入模式标志
unsigned short c_oflag;//输出模式标志
unsigned short c_cflag;//控制模式标志
unsigned short c_lflag;//区域模式标志或本地模式标志或局部模式
unsigned char c_line;//行控制line discipline
unsigned char c_cc[NCC];//控制字符特性
};
这个变量被用来提供一个健全的线路设置集合,如果这个端口在被用户初始化前使用,驱动初始化这个变量使用一个标准的数值乘,它拷贝自tty_std_termios变量,tty_std_termios定义在内核中,详细的请参考:http://blog.csdn.net/yemingzhu163/article/details/5897156
2.波特率的设置:获得串口信息,设置串口信息
获得串口信息:speed_t cfgetispeed(const struct termios* termios_p );和speed_t cfgetospeed(const struct termios* termios_p );
设置串口信息:int cfsetispeed(struct termios* termios_p, speed_t speed);和int cfsetospeed(struct termios* termios_p, speed_t speed);
3.数据位的设置:在设置数据为前,必须使用CSIZE做位屏蔽
获得串口指向的termios结构的指针->屏蔽其他位->设置是几位数据位->将修改后的termios结构体设置到串口中
4.奇偶校验位:简单的设置termios结构体中的c_flag
5.停止位:设置termios结构体中的c_cflag标志
6.我使用的是DO0400B4路继电器,根据文档利用串口助手向继电器发送指令可以实现继电器的控制。
所以根据文档,直接用write函数将指令输入即可。
遗留的问题;
光耦合的控制、DO0400B的拨码开关的作用、一些校验信息需不需要做,
实例:基于linux的串口通信
#include <terimos.h>
#include <unistd.h>
#include <string.h>
int main()
{
//串口的一些基本设置
struct termios* termios_relays;
bzero(terimos_relays, sizeof(struct terimos));
if(cgetispeed(termios_relays) != 9600) //确保串口的传输速率是9600
{
csetispeed(termios_relays, 9600);
csetospeed(termios_relays, 9600);
}
if(tcgetattr(termios_relays, termios_relays) != 0)//获得串口指向termios结构的指针
{
printf("getattr erro\n");
exit(0);
}
termios_p.c_cflag&=~CSIZE; //屏蔽其他标志
termios_p.c_cflag |= CLOCAL | CREAD | CS8; //设置数据位等
termios_p.c_cflag &=~PARENB; //无奇偶校验
termios_p.c_cflag &= ~CSTOPB; //1位停止位
termios_p.c_cflag &= ~CRTSCTS; //无数据流控制
tcsetattr(o_fd,TCSANOW,termios_p); //立即更新串口的设置
}