带有posix的串行IO和写入共享内存

时间:2018-04-16 11:02:37

标签: c++ serial-port posix shared-memory

我遇到了posix信号的问题,我用它来读取串行数据。首先是一个小例子代码,用于初始化我的串口,信号和共享内存。

#include <unistd.h>
#include <termios.h>
#include <sys/signal.h>
#include <stdint.h>
#include <cassert>
#include <cstdio>
#include <fcntl.h>
#include <iostream>
#include <QSharedMemory>

int fd;
struct termios termAttr;
struct sigaction saio;
char buff[255];
QSharedMemory QShare("IDSTRINGOFTHISMEMORY");

void signal_handler_IO (int status)
{
std::cout << "Got Serial Data!" << std::endl;
int si = read(fd, &buff[0], 255);

if(true) // Works with false here, but then the shared memory ist not used!
{
    char TWrite = 't';
    QShare.lock();
    char *to = (char*)QShare.data();
    const char *from = reinterpret_cast<char*>(&TWrite);
    memcpy(to, from, 1);
    QShare.unlock();
}
}

int main()
{
// Create SharedMemory:
QShare.create(1);

fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
    return -1;
}


saio.sa_handler = signal_handler_IO;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigemptyset(&saio.sa_mask);
sigaddset(&saio.sa_mask, SIGINT);
sigaction(SIGIO,&saio,NULL);

fcntl(fd, F_SETFL, FNDELAY|FASYNC);
fcntl(fd, F_SETOWN, getpid());

tcgetattr(fd,&termAttr);

cfsetospeed(&termAttr,B57600);
cfsetispeed(&termAttr,B57600);


termAttr.c_cflag &= ~PARENB;
termAttr.c_cflag &= ~CSTOPB;
termAttr.c_cflag &= ~CSIZE;
termAttr.c_cflag |= CS8;
termAttr.c_cflag |= (CLOCAL | CREAD);
termAttr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
termAttr.c_iflag &= ~(IXON | IXOFF | IXANY);
termAttr.c_oflag &= ~OPOST;
termAttr.c_cc[VMIN]     = 5;
tcsetattr(fd,TCSANOW,&termAttr);
while(true)
{
    usleep(1000000);
}
return 0;
}

我已经使用了一段时间的代码,它确实运行良好。现在,对于一个不同的项目,我想将串行数据存储在共享内存块中,这样我就可以从多个进程中读取当前的数据点。在signal_handler_IO中,我尝试将数据写入由sys / shm.h创建的共享内存。当我开始使用共享内存时,posix信号停止工作。由于我不确定共享内存的使用,我还尝试使用qt中的QSharedMemory类,它创建了相同的结果。

你能告诉我,共享内存对我的posix信号有什么作用吗?

0 个答案:

没有答案