嵌入式Linux的串口通讯C++程序设计.docVIP

  • 3
  • 0
  • 约6.39千字
  • 约 5页
  • 2017-08-22 发布于河南
  • 举报
嵌入式Linux的串口通讯C++程序设计 [日期:2010-08-25] 来源:Linux社区? 作者:Linux 嵌入式Linux工控板EM9160提供了6个标准异步串口:ttyS1——ttyS6,其中ttyS4、ttyS5、ttyS6和GPIO的管脚复用,每个串口都有独立的中断模式,使得多个串口能够同时实时进行数据收发。各个串口的驱动均已经包含在嵌入式Linux操作系统的内核中,EM9160在嵌入式Linux系统启动完成时,各个串口已作为字符设备完成了注册加载,用户的应用程序可以以操作文件的方式对串口进行读写,从而实现数据收发的功能。 串口编程接口函数 ??????? 在嵌入式Linux系统下,所有的设备文件都位于“/dev”目录下,EM9160上6个串口所对应的设备名依次为“/dev/ttyS1”——“/dev/ttyS6”。 ??????? 嵌入式Linux下操作设备的方式和操作文件的方式是一样的:调用open( )打开设备文件,再调用read( )、write( )对串口进行数据读写操作。这里需要注意的是打开串口除了设置普通的读写之外,还需要设置O_NOCTTY和O_NDLEAY,以避免该串口成为一个控制终端,因为如果作为一个终端有可能会影响到用户的进程。打开的方式如下: ??????? sprintf( portname, /dev/ttyS%d, PortNo ); //PortNo为串口端口号,从1开始 ??????? m_fd = open( portname,O_RDWR | O_NOCTTY | O_NONBLOCK); ??????? 作为串口通讯还需要一些通讯参数的配置,包括波特率、数据位、停止位、校验位等参数。在实际的操作中,主要是通过设置struct termios结构体的各个成员值来实现,一般会用到的函数包括: ??????? tcgetattr( ) ; ??????? tcflush( ); ??????? cfsetispeed( ); ??????? cfsetospeed( ); ??????? tcsetattr( ); ??????? 其中各个函数的具体使用方法这里就不一一介绍了,用户可以参考嵌入式Linux应用程序开发的相关书籍,也可参看Step2_SerialTest中Serial.cpp模块中set_port( )函数代码。 ? 串口应用的C++设计 ??????? Step2 _SerialTest是一个支持异步串口数据通讯的示例,该例程采用了面向对象的C++编程,把串口数据通讯作为一个对象进行封装,用户调用该对象提供的接口函数即可方便地完成串口通讯的操作。 ??????? CSerial类介绍 ??????? 利用上一小节中介绍的串口API函数,封装了一个支持异步读写的串口类CSerial,CSerial类中提供了4个公共函数、一个串口数据接收线程以及数据接收用到的数据Buffer。 ??????? class CSerial ??????? { ??????? private: ??????????????? //通讯线程标识符ID ??????????????? pthread_t m_thread; ??????????????? // 串口数据接收线程 ??????????????? static int ReceiveThreadFunc( void* lparam ); ??????? public: ??????????????? CSerial(); ??????????????? virtual ~CSerial(); ??????????????? int m_fd; // 已打开的串口文件描述符 ??????????????? int m_DatLen; ??????????????? char DatBuf[1500]; ??????????????? int m_ExitThreadFlag; ??????????????? // 按照指定的串口参数打开串口,并创建串口接收线程 ??????????????? int OpenPort( int PortNo, int baudrate, char databits, char stopbits, char parity ); ??????????????? // 关闭串口并释放相关资源 ??????????????? int ClosePort( ); ??????????????? // 向串口写数据 ??????????????? int WritePort( char* Buf, int len ); ??????????????? // 接收串口数据处理函数 ???????????

文档评论(0)

1亿VIP精品文档

相关文档