linux下的串口通信_Ubuntu

代码(回环测试)

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


#define SERIAL_NAME "/dev/ttyUSB0"

#define SERIAL0_NAME "/dev/ttyAMA0"
#define SERIAL1_NAME "/dev/ttyAMA1"
#define SERIAL2_NAME "/dev/ttyAMA2"

int serial_open(char *devName)
{
	int fd = -1;
 	fd = open(devName, O_RDWR|O_NOCTTY|O_NDELAY);
	if (-1 == fd)
	{
		 printf("Can't Open %s",devName);
		return(-1);
	}
	else 
	{
		printf("open  %s",devName);
	}
 
	 if(fcntl(fd, F_SETFL, 0)<0)
	 {
	 	printf("fcntl failed!\n");
		return(-1);
	 }
	 else
	 {
	 	printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
	}
	if(isatty(fd )==0)
	{
		printf("standard input is not a terminal device\n");
		return(-1);
	}
	else
	{
		printf("isatty success!\n");
	}
	printf("fd=%d\n",fd);
	return fd ;
}

int serial_set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio,oldtio;
	if  ( tcgetattr( fd,&oldtio)  !=  0) 
	{ 
		 perror("SetupSerial 1");
		return -1;
	}
	bzero( &newtio, sizeof( newtio ) );
	newtio.c_cflag  |=  CLOCAL | CREAD; 
	newtio.c_cflag &= ~CSIZE; 

	switch( nBits )
	{
		case 7:
			newtio.c_cflag |= CS7;
			break;
		case 8:
			newtio.c_cflag |= CS8;
			break;
	}

	switch( nEvent )
	{
	case 'O':                     //奇校验
		newtio.c_cflag |= PARENB;
		newtio.c_cflag |= PARODD;
		newtio.c_iflag |= (INPCK | ISTRIP);
		break;
	case 'E':                     //偶校验
		newtio.c_iflag |= (INPCK | ISTRIP);
		newtio.c_cflag |= PARENB;
		newtio.c_cflag &= ~PARODD;
		break;
	case 'N':                    //无校验
		newtio.c_cflag &= ~PARENB;
		break;
	}

	switch( nSpeed )
	{
	case 2400:
		cfsetispeed(&newtio, B2400);
		cfsetospeed(&newtio, B2400);
		break;
	case 4800:
		cfsetispeed(&newtio, B4800);
		cfsetospeed(&newtio, B4800);
		break;
	case 9600:
		cfsetispeed(&newtio, B9600);
		cfsetospeed(&newtio, B9600);
		break;
	case 115200:
		cfsetispeed(&newtio, B115200);
		cfsetospeed(&newtio, B115200);
		break;
	default:
		cfsetispeed(&newtio, B9600);
		cfsetospeed(&newtio, B9600);
		break;
	}
	
	if( nStop == 1 )
	{
		newtio.c_cflag &=  ~CSTOPB;
	}
	else if ( nStop == 2 )
	{
		newtio.c_cflag |=  CSTOPB;
	}
	
	newtio.c_cc[VTIME]  = 0;
	newtio.c_cc[VMIN] = 0;
	tcflush(fd,TCIFLUSH);
	 
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{
		printf("com set error");
	return -1;
	}
	
	printf("set done!\n");
	return 0;
}





void main(void)
{
	int fd=-1;
	int nread=0;
	unsigned char rbuff[512];


	if((fd=serial_open(SERIAL2_NAME))<0)
	{
		printf("open_port error");
		return;
	}

	if((serial_set_opt(fd,4800,8,'N',1))<0)
	{
		printf("set_opt error");
		return;
	}
	
	write(fd,"hello world \r\n",sizeof("hello world \r\n"));
	while(1)
	{

		// printf("hello world \r\n");
		// write(fd,"hello world \r\n",sizeof("hello world \r\n"));
		// sleep(1);

		nread = 0;
		memset(rbuff,0,sizeof(rbuff));
		nread=read(fd,rbuff,sizeof(rbuff));
		if(nread != 0)
		{
			printf("rbuff:%s(%d)\r\n",rbuff,nread);
			write(fd,rbuff,nread);
		}
	}
	close(fd);
	
    return;
}

相关函数

==============================================================================

1.open

所在头文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函数

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);

参数说明

参数:pathname

const char * pathname //指向欲打开的文件路径字符串

参数:flags
标志说明
O_RDONLY以只读方式打开文件
O_WRONLY以只写方式打开文件
O_RDWR以可读写方式打开文件. 上述三种flags是互斥的, 也就是不可同时使用, 但可与下列的flags利用OR(
O_CREAT若欲打开的文件不存在则自动建立该文件.
O_EXCL如果O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.
O_NOCTTY如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
O_TRUNC若文件存在并且以可写的方式打开时, 此flags会令文件长度清为0, 而原来存于该文件的资料也会消失.
O_APPEND当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
O_NONBLOCK以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
O_NDELAY同O_NONBLOCK.
O_SYNC以同步的方式打开文件.
O_NOFOLLOW如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败.
O_DIRECTORY如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败。注:此为Linux2. 2 以后特有的flags, 以避免一些系统安全问题.
参数:mode
标志可选值说明
S_IRWXU00700 权限代表该文件所有者具有可读、可写及可执行的权限.
S_IRUSRS_IREAD, 00400 权限代表该文件所有者具有可读取的权限.
S_IWUSRS_IWRITE, 00200 权限代表该文件所有者具有可写入的权限.
S_IXUSRS_IEXEC, 00100 权限代表该文件所有者具有可执行的权限.
S_IRWXG00070 权限代表该文件用户组具有可读、可写及可执行的权限.
S_IRGRP00040 权限代表该文件用户组具有可读的权限.
S_IWGRP00020 权限代表该文件用户组具有可写入的权限.
S_IXGRP00010 权限代表该文件用户组具有可执行的权限.
S_IRWXO00007 权限代表其他用户具有可读、可写及可执行的权限.
S_IROTH00004 权限代表其他用户具有可读的权限
S_IWOTH00002 权限代表其他用户具有可写入的权限.
S_IXOTH00001 权限代表其他用户具有可执行的权限.

返回值

返回0 :表示成功,
返回-1:只要有一个权限被禁止则返回-1

错误代码

错误代码说明
EEXIST参数pathname 所指的文件已存在, 却使用了O_CREAT 和O_EXCL flags.
EACCESS参数pathname 所指的文件不符合所要求测试的权限.
EROFS欲测试写入权限的文件存在于只读文件系统内.
EFAULT参数pathname 指针超出可存取内存空间.
EINVAL参数mode 不正确.
ENAMETOOLONG参数 pathname 太长.
ENOTDIR参数pathname 不是目录.
ENOMEM核心内存不足.
ELOOP参数pathname 有过多符号连接问题.
EIO I/O存取错误.

附加说明:使用 access()作用户认证方面的判断要特别小心, 例如在access()后再作open()空文件可能会造成系统安全上的问题.

==============================================================================

2.isatty

所在头文件

#include <unistd.h>

函数

int isatty(int desc);

参数说明

参数:pathname

参数 desc 文件描述符

返回值

如果参数 desc 所代表的文件描述符为一终端机则返回1, 否则返回0.

==============================================================================

未完待续。。。。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Ubuntu是一种很流行的Linux操作系统,可以与C语言一起使用来进行串口通信串口通信是通过串口传输数据的过程,可用于通信设备之间的数据传输。在Ubuntu中与串口通信可能需要进行以下几个步骤: 1. 安装串口驱动程序:首先需要确定计算机与哪个串口进行通信,然后安装相应的串口驱动程序。 2. 打开串口:可以使用C语言编写程序,打开串口进行通信。使用open()函数打开串口,设置串口参数。 3. 发送和接收数据:可以使用write()函数向串口发送数据,使用read()函数从串口接收数据。注意发送和接收的数据类型需要匹配。 4. 关闭串口:在通信结束后使用close()函数关闭串口。 总之,使用UbuntuC语言进行串口通信可以实现设备之间的数据传输,但需要注意串口的配置、调试和错误处理,以确保通信的正确性和可靠性。同时,还可以考虑使用其他编程语言或通信协议来实现更高效的通信方案。 ### 回答2: Ubuntu是一种基于Linux操作系统的开源软件,它支持C语言,可以通过该语言实现串口通信串口通信是指通过串口进行数据传输和通信,通常用于连接计算机和一些外围设备,如传感器、控制器和仪器等。在Ubuntu上进行串口通信需要安装相应的串口通信库,常用的有wiringPi和libserial等。这些库提供了函数和方法来操作串口,如打开、关闭串口、发送和接收数据等操作。 在C语言中,可以使用系统调用(open、read、write、close)来实现对串口的操作。首先,需要打开串口并设置串口参数,如波特率、数据位、校验位、停止位等。然后,可以使用write函数向串口发送数据,使用read函数从串口读取数据。最后,完成操作后需要关闭串口。在传输过程中,需要注意数据的格式和传输速率,以确保成功传输和解析数据。 除了C语言外,Ubuntu还支持其他编程语言来进行串口通信,如Python、Java等。这些语言也可以通过相应的库来实现串口通信,例如Python的pyserial库和Java的RXTX库。在使用这些语言进行串口通信时,同样需要了解串口的基本参数和使用方法。 在实际应用中,串口通信可以用于许多场景,如数据采集、控制和通信等。通过Ubuntu上的C语言或其他编程语言,我们可以轻松地实现串口通信,从而满足不同应用场景的需求。 ### 回答3: Ubuntu是一个开源的操作系统,适用于各种计算机和设备。串口通信也称为串行通信,是一种基于串行端口(COM端口)的通信方式,它在计算机和设备之间传输数据。本文将讨论如何在Ubuntu中使用C编程语言实现串口通信Ubuntu提供了读写串口的API函数,我们可以用C语言编写基于这些函数的程序来实现串口通信。以下是基本的步骤: 1. 打开串行端口 使用"open"函数来打开串行端口,该函数返回一个文件描述符,以用于后续的读写操作。例如: int fd; // 串口文件描述符 fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY); if(fd == -1){ // 打开串口失败 } 2. 配置串口 在打开串口之后,需要使用"tcgetattr"和"tcsetattr"函数来配置串口的参数,例如波特率、数据位数、校验位等。以下是一个示例程序: struct termios options; // 串口参数结构体 tcgetattr(fd, &options); // 获取当前串口参数 cfsetispeed(&options, B9600); // 设置输入速度为9600bps cfsetospeed(&options, B9600); // 设置输出速度为9600bps options.c_cflag |= (CLOCAL | CREAD); // 本地连接和接受使能 options.c_cflag &= ~PARENB; // 不使用校验位 options.c_cflag &= ~CSTOPB; // 数据位为1个停止位 options.c_cflag &= ~CSIZE; // 清除数据位掩码 options.c_cflag |= CS8; // 数据位为8个位 tcsetattr(fd, TCSANOW, &options); // 设置新的串口参数 3. 读取和写入数据 使用"read"和"write"函数来分别读取和写入串口数据,例如: char buf[64]; int len; len = read(fd, buf, sizeof(buf)); // 读取串口数据 if(len == -1){ // 读取失败 } write(fd, "Hello World!", 12); // 写入串口数据 4. 关闭串口 使用"close"函数来关闭串口: close(fd); 总之,通过使用C语言Ubuntu提供的串口API函数,我们可以轻松地实现串口通信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值