QNX Uart 驱动设计

QNX Uart 驱动设计

e-mail [email protected]     

     QNX 串口的应用层和linux串口应用开发过程基本一样,可以通过访问文件的方式,进行串口读写操作。关键是需要配置好底层驱动,本驱动采用加载动态库的方式,因为针对应用层,水平层次不一样,不知道串口怎样操作,至少在我们公司是这样的感觉。废话不多说,先看应用层如何调用。

首先定义一组串口接口操作方法:提供打开,关闭、读写等等操作。

typedef struct {
size_t size;
int32_t migicdat;
        int32_t (*serial_open)(int32_t uartno);
      void    (*serialSetSpeed)(int32_t uartno,int32_t speed);
     int32_t (*serialSetParity)(int32_t uartno,int32_t databits,int32_t stopbits,int32_t parity);
     int32_t (*serialread)(int32_t uartno,uint8_t * dat,size_t len);
     int32_t (*serialwrite)(int32_t uartno,uint8_t * dat,size_t len);
     int32_t (*serialclose)(int32_t uartno);

} ser_funcs_t;

       在QNX系统中,可以动态的加载链接库.so,然后操作连接库里面的方法。在进入main操作前,调用dlopen函数,该函数会到系统指定目录查找是否有改库文件,如果找到该库文件,则打开库文件,然后调用dlsym函数,找到匹配的符号表,改符号表在动态链接库里已经定义好,然后转换为定义好一组接口函数既可以操作。具体过程如下。

int main(int argc, char *argv[]) {
int  c, devnum = 0;
void *dlhdl;
dlhdl = dlopen("serailso.so", 0);
if (dlhdl != NULL) {
     ser = (ser_funcs_t *)dlsym(dlhdl, "drv_entry");
     if(ser==NULL)
       {
       dlclose(dlhdl);
       printf("can't not find drv_entry\r\n");
       exit(-1);
       }

}

if(ser ->serial_open(2))
{
ser ->serialSetSpeed(2,B9600);//设置串口波特率
ser ->serialSetParity(2,8,1,'N');//设置串口数据位 停止位 校验位
printf("serial_open 2 is ok\r\n");

}

while(1)
{

 ser ->serialwrite(2,"hello world\r\n",strlen("hello world\r\n"));

sleep(1);

}

}

以上是一个具体测试例子,这个例子在应用就很简单了,不需要掌握一些文件描述句柄和串口描述字符了,在后台还有两个线程进行串口接收和发送,接收线程会把接收的数据缓存起来,serialread链接到接收端口,串口接收缓冲区有数据就会触发serialread函数。


//串口底层和tty层,QNX系统已做好,修改相关配置,就可以实现多个串口加载。增加一个hwidev_add_uart,对应于增加一路串口端口。设置好串口基地址、中断号等等相关属性即可实现多串口加载。具体如下:


查看设备如下:ser2\ser3\ser4等等挂载了多个串口了。


测试结果如下:


mark一下:

  采用动态链接库加载,就可以少创建一个驱动进程了,驱动的具体应用可以有应用层去创建进程。



猜你喜欢

转载自blog.csdn.net/u011996698/article/details/80985283