利用摩萨(mosa)的API 写串口通信函数,怎样设置超时?
int TestComm::fhb_disinit(int port,int motorst)
{
const int nBytes = 3;
char cSendBuf[nBytes]={0x44,0x49,0x0D};
char cRet[2]={0x4F,0x4B};
char cReceiveRet[2]={0x00,0x00};
int iInBufLength;
int iOutBufLength;
int iPortStatus = m_bComStatus[port];
if (iPortStatus == false)
{
sio_open(port);
m_bComStatus[port] = true;
}
iOutBufLength = sio_oqueue(port); //检查接受缓冲区大小 可以用于接受write 函数发的字节
if (iOutBufLength == 0)
{
sio_write(port, cSendBuf,nBytes); //写数据到写端口
//以下是测试电机工作部分,电机发送一个返回值
int n = sio_SetReadTimeouts(port,10000,10000); //疑问:这一句话似乎没有作用???
//给电机一个反应时间
iInBufLength = sio_iqueue(port); //检查发送发送缓冲区 可以用于read函数读
if (iInBufLength >0)
{
sio_read(port,cReceiveRet,2);
}
int tmp = strncmp(cRet, cReceiveRet, 2); //字符串比较只比较前两位
if(tmp == 0)
{
iFunctionStatus = FHB_ERR_SUCCESS;
sio_close(port);
m_bComStatus[port] = false;
return iFunctionStatus; //读win32 文件错误
}
else
{
iFunctionStatus = FHB_ERR_UNKNOW;
sio_close(port);
m_bComStatus[port] = false;
return iFunctionStatus; //读win32 文件错误
}
}
else
{
iFunctionStatus = FHB_ERR_UNKNOW;
sio_close(port);
m_bComStatus[port] = false;
return iFunctionStatus;
}
}
int n = sio_SetReadTimeouts(port,10000,10000); //疑问:这一句话似乎没有作用???我本意是给另外一个串口回馈数据的时间(来得及发送),然后此串口可以读取。但是另外一个串口根本来不及发送,这个设置串口读时间无用?
谢谢。
[解决办法]
你的接收直接放在发送的后面 这样做不合理,
由于种种情况的原因,很难得设备何时准确的返回的数据
建议你发送和读取分开,
读取用一个线程专门来监控串口的数据,
[解决办法]
mosa的内部实现具体不清楚。
不过楼主可以用Widnows的API: SetCommTimeouts