简单的串行通信程序

我写的非常早期的串行通信代码。但是,今天也用,做一个简单的类封装。

码,如以下:

rs485Test.h

#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

class RS485 {

	public:
		////////////////////////////////////////////////////////////
		/// 创建串口的连接
		/// @param name 设备名
		/// @param speed 波特率
		/// @param parity 奇偶校验
		/// @param databits 数据位
		/// @param stopbits 停止位
		////////////////////////////////////////////////////////////
		RS485(char *name,int speed,int parity,int databits,int stopbits);
		~RS485();
		////////////////////////////////////////////////////////////
		/// 发送串口消息
		/// @param fd 消息结构体
		/// @param buf 消息结构体
		/// @param length 消息结构体
		/// @return -1:失败,0:成功
		////////////////////////////////////////////////////////////
		int sendMsg(unsigned char * buf, int length);
		////////////////////////////////////////////////////////////
		/// 接收串口消息
		/// @param fd 消息结构体
		/// @param msg 消息结构体
		/// @param length 消息结构体
		/// @return -1:失败,0:成功
		////////////////////////////////////////////////////////////
		int recvMsg(unsigned char * msg, int length);

	private:
		////////////////////////////////////////////////////////////
		/// 打开串口设备
		/// @param dev 串口设备名
		/// @return -1:失败。0:成功
		////////////////////////////////////////////////////////////
		int openTTY(const char *dev);
		////////////////////////////////////////////////////////////
		/// 设置串口波特率
		/// @param fd 串口设备文件描写叙述符
		/// @param speed 串口波特率
		/// @return -1:失败,0:成功
		////////////////////////////////////////////////////////////
		void setTTYSpeed(int fd, int speed);
		////////////////////////////////////////////////////////////
		/// 设置串口属性
		/// @param fd 串口设备文件描写叙述符
		/// @param databits 串口数据位
		/// @param stopbits 串口停止位
		/// @param parity 串口奇偶校验
		/// @return -1:失败。0:成功
		////////////////////////////////////////////////////////////
		int setTTYProperties(int fd,int databits,int stopbits,int parity);
		////////////////////////////////////////////////////////////
		/// 打开串口设备
		/// @param fd 串口设备文件描写叙述符
		/// @return -1:失败,0:成功
		////////////////////////////////////////////////////////////
		void closeTTY(int fd);

		int fd;
};

rs485Test.cpp

#include "rs485Test.h"

int speed_arr[] =
{ B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300 };

int name_arr[] =
{ 115200, 38400, 19200, 9600, 4800, 2400, 1200, 300 };

RS485::RS485(char *name,int speed,int parity,int databits,int stopbits)
{
    fd = openTTY(name);
    if (0 > fd)
    {
        printf("tranConstructSerial(): Open the %s device fail\n", name);
    }
	else
	{
		setTTYSpeed(fd, speed);
		setTTYProperties(fd, databits, stopbits, parity);
	}
}

RS485::~RS485()
{
	close(fd);
}

int RS485::openTTY(const char *dev)
{
    int fd;
    if (NULL == dev || 0 == strlen(dev))
        return -1;
    fd = open(dev, O_RDWR | O_NOCTTY);

    if (-1 == fd)
    {
        printf( "openTTY(): open then TTYdevice fail.\n");
        return -2;
    }
    return fd;
}

void RS485::setTTYSpeed(int fd, int speed)
{
    int i;
    int status;
    struct termios Opt;

    memset(&Opt, 0, sizeof(struct termios));
    tcgetattr(fd, &Opt);
    for (i = 0; i < sizeof(speed_arr) / sizeof(int); i++)
    {
        if (speed == name_arr[i])
        {
            tcflush(fd, TCIOFLUSH);
            cfsetispeed(&Opt, speed_arr[i]);
            cfsetospeed(&Opt, speed_arr[i]);
            status = tcsetattr(fd, TCSANOW, &Opt);
            if (status != 0)
            {
                printf("setTTYSpeed(): tcsetattr fd fail\n");
                return;
            }
            tcflush(fd, TCIOFLUSH);
        }
    }
}

int RS485::setTTYProperties(int fd, int databits, int stopbits, int parity)
{

    struct termios options;
    memset(&options, 0, sizeof(struct termios));

    if (tcgetattr(fd, &options) != 0)
    {
        printf("setTTYProperties(): Can't get attr when setup Serial\n");
        return -1;
    }

    options.c_cflag &= ~CSIZE;

    switch (databits)
    {
    case 7:
        options.c_cflag |= CS7;
        break;

    case 8:
        options.c_cflag |= CS8;
        break;

    default:
        printf("setTTYProperties(): Unsupported data size\n");
        return -2;
    }

    switch (parity)
    {
    case 'n':
    case 'N':
        options.c_cflag &= ~PARENB; /* Clear parity enable */
        options.c_iflag &= ~INPCK; /* Enable parity checking */
        break;
    case 'o':
    case 'O':
        options.c_cflag |= (PARODD | PARENB);
        options.c_iflag |= INPCK; /* Disnable parity checking */
        break;
    case 'e':
    case 'E':
        options.c_cflag |= PARENB; /* Enable parity */
        options.c_cflag &= ~PARODD;
        options.c_iflag |= INPCK; /* Disnable parity checking */
        break;
    case 'S':
    case 's': /*as no parity*/
        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        break;
    default:
        printf("setTTYProperties(): Unsupported parity\n");
        return -3;
    }

    switch (stopbits)
    {
    case 1:
        options.c_cflag &= ~CSTOPB;
        break;
    case 2:
        options.c_cflag |= CSTOPB;
        break;
    default:
        printf("setTTYProperties(): Unsupported stop bits\n");
        return -4;
    }

    /* Set input parity option */

    if (parity != 'n' && parity != 'N')
        options.c_iflag |= INPCK;

    tcflush(fd, TCIFLUSH);
    options.c_cc[VTIME] = 5;
    options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
    /*set serial mode */
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG | IEXTEN); /*Input*/
    options.c_oflag &= ~OPOST; /*Output*/
    options.c_iflag &= ~(ICRNL | IXON | BRKINT | ISTRIP);
    options.c_cflag |= (CLOCAL | CREAD);

    if (tcsetattr(fd, TCSANOW, &options) != 0)
    {
        printf("setTTYProperties(): Setup Serial fail\n");
        return -5;
    }
    return 0;
}

void RS485::closeTTY(int fd)
{
    close(fd);
}

int RS485::sendMsg(unsigned char * buf, int length)
{
    int res;
    res = write(fd, buf, length);
    if (res != length)
    {
        printf("send_Msg(): Send buf fail!\n");
        return -1;
    }
	printf("res = %d\n",res);
    return 0;
}

int RS485::recvMsg(unsigned char * msg, int length)
{
    if (NULL == msg || 0 == length)
        return 0;
    printf( "recv_Msg(): the length of received buffer: %d\n", length);
    return read(fd, msg, length);
}

int main()
{
	RS485 rs485Test("/dev/ttyUSB0", 115200, 'n', 8, 1);
	unsigned char buf[8]="lklk\n";
	rs485Test.sendMsg(buf,8);
	return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-11-06 09:42:48

简单的串行通信程序的相关文章

利用JSP编程技术实现一个简单的购物车程序

实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP中数据库编程方法: 二.实验要求 : 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来处理用户提交的登录信息,如果用户名为本小组成员的名字且密码为对应的学号时,采用J

一个简单的Qt程序分析

本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button, SIGNA

通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1 1)实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与

Linux终端下简单的登录程序 密码不回显

在Linux进行登录是输入密码不会被回显,所以我也写了个简单的登入程序,使得在输入密码时不再进行回显. #include <stdio.h> #include <stdlib.h> #include <termios.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <stdbool.h> #define USER_NAME &qu

一个简单的Java程序

一个.NET技术还是很菜的水平的猿人现在要去学习Java不知道是坏是好,无从得知啊! 不过在网上看了好多Java方面的简单例子,感觉Java还是蛮不错的么!不管以后怎么样啦,先开始自己的Java菜鸟之旅吧! 建立一个Java项目,建立一个属于自己的包,然后就开始自己的Java之旅... 创建的时候勾上这个生成main方法的选项,这个好像类似与我们.Net程序里控制台程序有木有.... 创建完成后就是这么一个样子,可以看到我们的包,还有给我们创建好自己的类,并且带了一个静态的main方法咋看就像.

01 最简单的WebGL程序

我们新建一个html页面,将下面的代码复制粘贴到里面,一个最简单的WebGL程序就写好了.借助这一个程序,大家可以尝试改变各个值的大小,了解一下WebGL各个坐标值的方向和坐标值的大小.从下一节开始,我们利用最简单的程序,继续介绍WebGL的相关知识. 1 <!DOCTYPE html> 2 3 <html lang="zh-CN"> 4 5 <head> 6 <meta charset="UTF-8" /> 7 &l

理解计算机的工作方式——通过汇编一个简单的C程序并分析汇编代码

Author: 翁超平 Notice:原创作品转载请注明出处 See also:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  本文通过汇编一个简单的C程序,并分析汇编代码,来理解计算机是如何工作的.整个过程都在实验楼上完成,感兴趣的读者可以通过上面给出的课程链接自行动手学习.以下是实验过程和结果. 一.操作步骤 1.首先在通过vim程序建立main.c文件.代码如下: 图1 2.使用如下命令将main.c编

1.一个简单的OpenGL程序

一.OpenGL介绍 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的. 如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单. 2.强大的可移植性. 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机). 而OpenGL不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机.各种专

如何利用CEF3创建一个简单的应用程序 (Windows Platform)

1. 说明 这篇文章主要讲述如何利用CEF3来创建一个简单的应用程序,引用的是1535及以上版本中包含的 Cefsimple 项目例子.如果想知道关于CEF3更多的使用方法,可以去访问 GeneralUsage. 2. 开始 首先,根据自身所使用的开发平台,可以去 这里 下载对应的发布版本.针对这个教程,我们需要下载1750或者更新的版本.当前支持的平台有Windows, Linux和Mac OS X.每一个版本都包含了当在特定平台上编译特定版本CEF3时所需要的所有文件和资源.您可以通过包含在