关于继电器的串口通信的写法

前段时间写过串口通信方面的,时间久了就忘记了,也没做总结,今天又要面临这个问题,于是便把它的实现写下来,今天主要写一写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);     //立即更新串口的设置
}

你可能感兴趣的:(关于继电器的串口通信的写法)