浅谈linux下的串口通讯开发

2019-10-13 11:20:14王冬梅

只能有一人通道进行通信.

流控: 
    
    通常,当数据在两个串行接口之间进行传输时需要对其进行控制.
    这通常依赖于串行通信连接的各种规定,
    对异步数据传输的控制有两种方法.
    一种叫:“软件”流控 。
    一种叫: “硬件"流控 。

串口设备:

打开一个串行口

#include 
#include 
#include 
#include  // 文件控制定义 
#include 
#include  //POSIX终端控制定义 
/* 
* open_port() --打开串行口 
* 
* 成功的话,返回文件描述符,错误则返回 -1. 
*/ 
int open_port(void) 
{ 
  int fd; 
  fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY); 
  if (fd == -1) 
  { 
  /*无法打开串口*/ 
  perror("open_port : Unable to open /dev/ttyS0"); 
  } 
  else 
    fcntl(fd,F_SETFL,0); 
  return (fd); 
} 
//O_NOCTTY 标志 ,该程序不想成为此端口的“控制终端"。 如果没有强调这一点, 
//O_NDELAY标志 , 标志告诉Linux ,该程序并不关注DCD信叼线所处的状态, 即不管另外一端的设备是在运行还是被挂起。如果没有指定该标志,那么程序就会被设置睡 眠状态, 

(2)向端口写数据

向端口写数据是很容易的,只要使用write()系统调用就可以了。

例如:

 n=write(fd,"ATZ/r",4); 
  if (n<0) 
    fputs("write() of 4 bytes failed!/n",stderr); 

 

write函数返回发送数据的个数,如果出现错误,则返回 -1。

(3) 读端口数据

从端口读数据则需要些技巧。如果在原始数据的模式下对端口进行操作, read()系统调用将返回串行口输入缓冲区中所有的字符数据,不管有多少,如果没有数据,那么该调用将被阻塞.处于等待状态,直到有字符输入,

或者到了规定的时限和出现错误为止,通过以下方法,能使read函数立即返回。

fcntl(fd,F_SETFL,FNDELAY);
FNDELAY 函数使read函数在端口没月字符存在的情况下,立刻返回0,

如果要恢复正常(阻塞)状态,可以调用fcntl()函数,不要FNDELAY参数,

如下所示: 

fcntl(Fd,F_SETFL,0);

在使用O_NDELAY参数打开串行口后,同样与使用了该函数调用。

fcntl(fd,F_SETFL,0);

POSIX终端接口 串口,波特率,字符大小等,  POSIX函数是 tcgetattr()和tcsetattr() 获取和设置终端的属性, 可以提供 structrure termios的指针

以上就是小编为大家带来的浅谈linux下的串口通讯开发全部内容了,希望大家多多支持易采站长站~