Linux下读写UART串口的代码

Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比较的复杂,就直接跳过了,好在代码能用,记录一下~

两个有用的函数~

////////////////////////////////////////////////////////////////////////////////
/**
*@brief  设置串口通信速率
*@param  fd     类型 int  打开串口的文件句柄
*@param  speed  类型 int  串口速度
*@return  void
*/
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
          		   B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200,  300,
		  		  115200, 38400, 19200, 9600, 4800, 2400, 1200,  300, };
void set_speed(int fd, int speed){
  int   i;
  int   status;
  struct termios   Opt;
  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) {
        perror("tcsetattr fd1");
        return;
      }
      tcflush(fd,TCIOFLUSH);
    }
  }
}
////////////////////////////////////////////////////////////////////////////////
/**
*@brief   设置串口数据位,停止位和效验位
*@param  fd     类型  int  打开的串口文件句柄
*@param  databits 类型  int 数据位   取值 为 7 或者8
*@param  stopbits 类型  int 停止位   取值为 1 或者2
*@param  parity  类型  int  效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
	struct termios options;
	if  ( tcgetattr( fd,&options)  !=  0) {
		perror("SetupSerial 1");
		return(FALSE);
	}
	options.c_cflag &= ~CSIZE;
	switch (databits) /*设置数据位数*/
	{
	case 7:
		options.c_cflag |= CS7;
		break;
	case 8:
		options.c_cflag |= CS8;
		break;
	default:
		fprintf(stderr,"Unsupported data size\n"); return (FALSE);
	}
	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:
			fprintf(stderr,"Unsupported parity\n");
			return (FALSE);
		}
	/* 设置停止位*/
	switch (stopbits)
	{
		case 1:
			options.c_cflag &= ~CSTOPB;
			break;
		case 2:
			options.c_cflag |= CSTOPB;
		   break;
		default:
			 fprintf(stderr,"Unsupported stop bits\n");
			 return (FALSE);
	}
	/* Set input parity option */
	if (parity != ‘n‘)
		options.c_iflag |= INPCK;
	tcflush(fd,TCIFLUSH);
	options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
	options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
	if (tcsetattr(fd,TCSANOW,&options) != 0)
	{
		perror("SetupSerial 3");
		return (FALSE);
	}
	options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
	options.c_oflag  &= ~OPOST;   /*Output*/
	return (TRUE);
}

调用的方法比较的简单,如下,fd是打开的tty设备的文件句柄

    set_speed(fd,115200);
    if (set_Parity(fd,8,1,‘N‘) == FALSE)  {
	printf("Set Parity Error\n");
    }

总的测试代码如下。

#include <sys/types.h>

#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE        B115200
#define UART_DEVICE     "/dev/ttyS3"

#define FALSE  -1
#define TRUE   0
////////////////////////////////////////////////////////////////////////////////
/**
*@brief  设置串口通信速率
*@param  fd     类型 int  打开串口的文件句柄
*@param  speed  类型 int  串口速度
*@return  void
*/
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
          		   B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200,  300,
		  		  115200, 38400, 19200, 9600, 4800, 2400, 1200,  300, };
void set_speed(int fd, int speed){
  int   i;
  int   status;
  struct termios   Opt;
  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) {
        perror("tcsetattr fd1");
        return;
      }
      tcflush(fd,TCIOFLUSH);
    }
  }
}
////////////////////////////////////////////////////////////////////////////////
/**
*@brief   设置串口数据位,停止位和效验位
*@param  fd     类型  int  打开的串口文件句柄
*@param  databits 类型  int 数据位   取值 为 7 或者8
*@param  stopbits 类型  int 停止位   取值为 1 或者2
*@param  parity  类型  int  效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
	struct termios options;
	if  ( tcgetattr( fd,&options)  !=  0) {
		perror("SetupSerial 1");
		return(FALSE);
	}
	options.c_cflag &= ~CSIZE;
	switch (databits) /*设置数据位数*/
	{
	case 7:
		options.c_cflag |= CS7;
		break;
	case 8:
		options.c_cflag |= CS8;
		break;
	default:
		fprintf(stderr,"Unsupported data size\n"); return (FALSE);
	}
	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:
			fprintf(stderr,"Unsupported parity\n");
			return (FALSE);
		}
	/* 设置停止位*/
	switch (stopbits)
	{
		case 1:
			options.c_cflag &= ~CSTOPB;
			break;
		case 2:
			options.c_cflag |= CSTOPB;
		   break;
		default:
			 fprintf(stderr,"Unsupported stop bits\n");
			 return (FALSE);
	}
	/* Set input parity option */
	if (parity != ‘n‘)
		options.c_iflag |= INPCK;
	tcflush(fd,TCIFLUSH);
	options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
	options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
	if (tcsetattr(fd,TCSANOW,&options) != 0)
	{
		perror("SetupSerial 3");
		return (FALSE);
	}
	options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
	options.c_oflag  &= ~OPOST;   /*Output*/
	return (TRUE);
}
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{

    int    fd, c=0, res;

    char  buf[256];

    printf("Start...\n");
    fd = open(UART_DEVICE, O_RDWR);

    if (fd < 0) {
        perror(UART_DEVICE);
        exit(1);
    }

    printf("Open...\n");
    set_speed(fd,115200);
	if (set_Parity(fd,8,1,‘N‘) == FALSE)  {
		printf("Set Parity Error\n");
		exit (0);
	}

    printf("Reading...\n");
    while(1) {
        res = read(fd, buf, 255);

        if(res==0)
            continue;
        buf[res]=0;

        printf("%s", buf);

        if (buf[0] == 0x0d)
        	printf("\n");

        if (buf[0] == ‘@‘) break;
    }

    printf("Close...\n");
    close(fd);

    return 0;
}

Linux下读写UART串口的代码,码迷,mamicode.com

时间: 2024-10-24 22:24:22

Linux下读写UART串口的代码的相关文章

linux下使用gcc/g++编译代码时gets函数有错误

今天在linux中使用个g++编译一个名为myfirst.cpp的代码的时候,出现如下错误 myfirst.cpp: In function ‘int main()’:myfirst.cpp:11:2: warning: ‘char* gets(char*)’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations] gets(cc); ^myfirst.cpp:11:9: warning:

linux 下向github上传代码

上传代码: cd TPS/devices/M8 git init                      #//初始化 git add .                    #如果是.表示上传全部目录下的文件,可以是某个文件 git commit -m 'version 1.0' git remote add origin https://github.com/jiugui1/TOS.git git push origin master -f #[email protected]:~/to

c++(vs上)与g++(linux下)对于++操作的汇编代码解读

先来看一个代码,估计很多同学都碰到过其中的某一个. #include <stdio.h> #include <iostream> using namespace std; int main() { int a = 5; printf("a++ = %d\n", a++); a = 5; printf("++a = %d\n", ++a); a = 5; printf("a += a++ =%d\n", a += a++);

linux下检测可用串口并使用minicom打开

目前使用minicom作为串口软件.但使用过程中,有一点感觉不方便的地方,就是我需要使用多个串口,当使用的不是串口0时,就要手动修改minicom的配置. 于是考虑实现脚本,自动列出当前串口,选择后调用minicom打开指定串口,免去手工修改的麻烦. 首先,在minicom的配置目录下,建立配置文件 /etc/minicom/minirc.ttyUSBx 内容如下,其实就是将/dev/ttyUSB0的配置保存为文件 # Machine-generated file - use "minicom

第一章 在linux下python读串口 存MYSQL数据库(703N)

import MySQLdb//定义引用数据库的驱动文件 import serial import time ser = serial.Serial('/dev/ttyATH0', 115200, timeout=65)//读串口 while True: data = ser.readline() print repr(data)//输出读到的数据 conn=MySQLdb.connect(host='192.168.2.1',user='root',passwd='root',db='ma'/

linux下检测可用串口并使用minicom打开(改进版)

之前使用的方式是这样的 http://www.cnblogs.com/zqb-all/p/7073612.html 这两天看到minicom的参数,可以直接使用 -D 指定设备,于是修改成了这样 建立隐藏文件  ~/.zqball_minicom com() { ports=`ls /dev/ttyUSB*` select port in $ports;do if [ $port ]; then echo "You select the choice '$port'" minicom

linux下USB串口,minicom

[一].驱动相关说明: 如果直接使用串口线,而没有用到USB转串口设备,就不需要安装驱动. 如果使用了USB转串口,一般情况下也不需要安装驱动了,目前linux系统已经包含了该驱动,可以自动识别,亦可通过以下命令查看以便确认是否支持. 查看模块装载的情况: 引用 # lsmod |grep pl2303 pl2303                 18629  0 usbserial              29865  1 pl2303 如果看到类似于上述信息,则表明能正确识别该设备,否则

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

搭建linux下的DNW烧写环境(替代windows下的超级串口终端和DNW)

软件环境:ubuntu 13.10 硬件环境:TQ2440开发板 由于我的PC机操作系统是win8.1,不知何故死活装不上天嵌给的USB下载驱动,所以在PC下烧写开发板系统和裸机程序变得不可能,后来经过一番摸索,发现完全可以在linux下用minicom代替windows下的超级串口终端,用dnw2(linux版本)代替windows下的DNW,下面是具体的环境搭建过程: 搭建linux下的minicom串口通信环境: 1.1 下载并安装minicom,在终端输入命令:sudo apt-get