使用unistd.h和C写入mac OSX 10.9.3上的串行端口

使用unistd.h和C写入mac OSX 10.9.3上的串行端口,c,macos,serial-port,C,Macos,Serial Port,我正试图用标准C中的unistd.h将一些字节写入mac OSX 10.9.3上的串行端口。我知道有一个类似的主题,但它已经存在4年了,存在一个不同的问题,因此请原谅我启动了一个新线程 我的问题是写();函数,它总是以-1的值返回。打开我的端口的代码如下: corbyte=0; numBytes=0; 布尔阻塞=假; //设置新旧结构 新结构; fd=打开(端口,O|RDWR | O|NOCTTY |(阻塞?0:O|NDELAY)); 如果(fd

我正试图用标准C中的unistd.h将一些字节写入mac OSX 10.9.3上的串行端口。我知道有一个类似的主题,但它已经存在4年了,存在一个不同的问题,因此请原谅我启动了一个新线程

我的问题是写();函数,它总是以-1的值返回。打开我的端口的代码如下:

corbyte=0;
numBytes=0;
布尔阻塞=假;
//设置新旧结构
新结构;
fd=打开(端口,O|RDWR | O|NOCTTY |(阻塞?0:O|NDELAY));
如果(fd<0)
{
返回端口错误;
}
bzero(&newtio,sizeof(newtio));
如果(cfsetispeed(&newtio,BDR_ESP3)!=0)
返回端口错误;
如果(cfsetospeed(&newtio,BDR_ESP3)!=0)
返回端口错误;
newtio.c_cflag&=~PARENB;
newtio.c_cflag&=~CSTOPB;
newtio.c_cflag&=~CSIZE;
newtio.c|u cflag |=CS8;
newtio.c_cflag&=~CRTSCTS;
//端口的硬件控制
newio.c_cc[VTIME]=阻塞?1 : 0; // 阻塞时读取TIM 100毫秒
newtio.c_cc[VMIN]=0;
tcflush(fd,TCIFLUSH);
//获取新端口设置
如果(tcsetattr(fd、TCSANOW和newtio)!=0)
put(strerror(errno));
返回OK;
我可以毫无问题地打开端口,但一旦我尝试使用以下方法向端口写入一个字节:

{
国际关系;
如果(fd==-1)
返回端口错误;
res=写入(fd和u8TxByte,1);
如果(res==-1){
printf(“写入端口%s(%d)时出错)。\n”,strerror(errno),errno;
}
如果(res==1)
printf(“写入端口成功!”);
返回OK;
返回误差;
}
我不断得到这样的错误输出:

写入端口时出错-资源暂时不可用(35)

它快把我逼疯了!因为相同的代码实际上在Linux上工作,所以这里与OSX的区别在哪里?资源暂时不可用是什么意思

我希望我对我的问题描述得足够好,有人能帮助我!
谢谢

使用相应的
/dev/cu.xxx
设备,您的程序可能会工作


/dev/tty.xxx
用于OS/X上的传入连接,只有在断言DCD时才会工作。

使用相应的
/dev/cu.xxx
设备,您的程序可能会工作


/dev/tty.xxx
用于OS/X上的传入连接,仅在断言DCD时才起作用。

1。)您使用的是哪个端口/设备文件?2.)您正在向打开的设备写入
O_NONBLOCK
——这意味着您指示
write()
在调用将被阻塞时立即返回。现在的问题是——它为什么会阻塞?-请参见1.)im使用“/dev/tty.usbserial-FTVQS67J”作为设备路径。1.)您使用的是哪个端口/设备文件?2.)您正在向打开的设备写入
O_NONBLOCK
——这意味着您指示
write()
在调用将被阻塞时立即返回。现在的问题是——它为什么会阻塞?-请参阅1。)我使用“/dev/tty.usbserial-FTVQS67J”作为设备路径。我现在无法测试它,因为我不在办公室了,但我明天会尝试。那么这是否解释了为什么同样的代码在使用tty设备的Linux上工作?Linux处理设备的方式不同吗?哇,非常感谢!我刚刚测试过,它真的很有效。我现在想知道的是,…为什么在我使用boost::asio时,tty设备一直在工作?boost是否在内部处理此问题?如果您在
struct termios
中指定
CLOCAL
,它也可能与tty.xxx设备一起工作(boost也可以这样做)。根据文档,这将消除tty设备对调制解调器状态行的依赖。你又对了!它也适用于CLOCAL标志!非常感谢你!我现在不能测试,因为我不在办公室了,但我明天会试试。那么这是否解释了为什么同样的代码在使用tty设备的Linux上工作?Linux处理设备的方式不同吗?哇,非常感谢!我刚刚测试过,它真的很有效。我现在想知道的是,…为什么在我使用boost::asio时,tty设备一直在工作?boost是否在内部处理此问题?如果您在
struct termios
中指定
CLOCAL
,它也可能与tty.xxx设备一起工作(boost也可以这样做)。根据文档,这将消除tty设备对调制解调器状态行的依赖。你又对了!它也适用于CLOCAL标志!非常感谢你!