关于一个串口在多进程中的使用

时间:2022-01-06 05:23:06
ind fd;

void task1(void)
{
    #ifndef COM_OPEN
        fd = open("/tyCo/0",O_RDWR,0);
     if(fd == ERROR)
     {
          return ERROR;
     }
    ioctl(fd,FIOSETOPTIONS,OPT_RAW);
    ioctl(fd, FIOFLUSH,0);
     setBaud(fd,COM0_BAUD);
     setOption(fd,8,1,0);    
#define COM_OPEN
    #endif
    while(1)
    {
  ...
    }
}

void task2(void)
{
    #ifndef COM_OPEN
        fd = open("/tyCo/0",O_RDWR,0);
     if(fd == ERROR)
     {
          return ERROR;
     }
    ioctl(fd,FIOSETOPTIONS,OPT_RAW);
    ioctl(fd, FIOFLUSH,0);
     setBaud(fd,COM0_BAUD);
     setOption(fd,8,1,0);    
#define COM_OPEN
    #endif
    while(1)
    {
  ...
    }
}


void task3(void)
{
    #ifndef COM_OPEN
        fd = open("/tyCo/0",O_RDWR,0);
     if(fd == ERROR)
     {
          return ERROR;
     }
    ioctl(fd,FIOSETOPTIONS,OPT_RAW);
    ioctl(fd, FIOFLUSH,0);
     setBaud(fd,COM0_BAUD);
     setOption(fd,8,1,0);    
#define COM_OPEN
    #endif
    while(1)
    {
  ...
    }
}

如果其中任意一个任务退出或重启了,那么串口是不是需要再次打开?任务退出或重启时,串口会不会被操作系统自动关闭?因为3个任务开始只在任意进程里打开1次串口,是否还需要在各个进程的while(1)里再加上预防串口关闭的操作(也就是再次打开)?其中各个进程里对fd采取了互斥或同步操作

这个问题对我比较重要,还请哪位兄弟指点一下,拜谢!

7 个解决方案

#1


友情UP~!

#2


帮顶了……

#3


task1 打开并初始化,task2/task3 打开并使用,注意互斥与同步!

#4


多次打开?这样是不是不大好?根据驱动支持的吧
要是驱动不支持多次打开不就挂了

#5


如果其中任意一个任务退出或重启了,那么串口是不是需要再次打开?任务退出或重启时,串口会不会被操作系统自动关闭?
==============================================================================================
文件描述符表是属于进程的,进程退出时,会关闭所有打开的文件。串口设备文件当然不例外。

#6


楼主的程序思路是有问题的。

task1/2/3各自打开文件得到的描述符,是进程私有的。不能被其他进程(子进程除外)使用。

而且用条件编译控制串口的打开,也是有问题的。因为task1/2/3的执行顺序和编译顺序是不同的。

#7


那应该怎么安排呢?每个进程分别打开串口,然后进行操作?
这样对串口多次打开,3个文件描述符分别使用,即使有互斥与同步,应该也是有问题的吧
当一个进程推出,而其他两个进程正在使用该串口,这样的话那两个进程不也就出错了吗?请LS的兄弟给分析一下,谢谢!
如有可能给出简单的代码示例更好...

#1


友情UP~!

#2


帮顶了……

#3


task1 打开并初始化,task2/task3 打开并使用,注意互斥与同步!

#4


多次打开?这样是不是不大好?根据驱动支持的吧
要是驱动不支持多次打开不就挂了

#5


如果其中任意一个任务退出或重启了,那么串口是不是需要再次打开?任务退出或重启时,串口会不会被操作系统自动关闭?
==============================================================================================
文件描述符表是属于进程的,进程退出时,会关闭所有打开的文件。串口设备文件当然不例外。

#6


楼主的程序思路是有问题的。

task1/2/3各自打开文件得到的描述符,是进程私有的。不能被其他进程(子进程除外)使用。

而且用条件编译控制串口的打开,也是有问题的。因为task1/2/3的执行顺序和编译顺序是不同的。

#7


那应该怎么安排呢?每个进程分别打开串口,然后进行操作?
这样对串口多次打开,3个文件描述符分别使用,即使有互斥与同步,应该也是有问题的吧
当一个进程推出,而其他两个进程正在使用该串口,这样的话那两个进程不也就出错了吗?请LS的兄弟给分析一下,谢谢!
如有可能给出简单的代码示例更好...