最近在尝试使用RS232 发送指令与设备沟通
找了一些网络上的范例与资料
并且利用两条 "USB 转 RS232"沟通两个VM
使用cutecom 来检查发送结果
程式目前已经拥有发送指令的功能
但是在传送上会有不太稳定的状况
测试的角色与环境有以下几种
1. main.cpp (VMplayer with Ubuntu 13.10) VM_A
2. cutecom (VMplayer with Ubuntu 13.10) VM_A
3. cutecom (VMplayer with Ubuntu 13.10) VM_B
4. 厂商的测试程式 (Win 8.1)
5. 欲沟通的设备
目前 2 3 4 5 之间的相互沟通都没有问题
但是使用我写出来的程式(1) 则有时候会失败
接收端会接收不到资料
当1发生失败后 再使用2便无法与 3 4 5沟通
必须拔除USB后 甚至将VM重开2 才能正常与 3 4 5沟通
因此猜测是否是程式流程上 或是 设定上有什么问题
麻烦各位前辈帮我看看
程式码如下
int main()
{
string s = "10 02 00 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 10 03 02 ";
string cmdStr;
clearStrSpace(&s, &cmdStr);
if (!cmdCheck(&cmdStr))
exit(-1);
unsigned char *hexCmd = new unsigned char[cmdStr.length()+1];
strToHexCmd(&cmdStr, hexCmd, cmdStr.length());
//以上为字串处理 将字串转为hex 处理结果存于hexCmd中
int fp, res;
struct termios oldtio,newtio;
fp=open(MODEMDEVICE ,O_RDWR|O_NDELAY|O_NOCTTY);
if (fp <0) { perror (MODEMDEVICE); exit(-1);}
tcgetattr(fp,&oldtio); // 储存目前的序列埠设定。
bzero(&newtio, sizeof(newtio)); // 清除结构体以放入新的序列埠设定值。
newtio.c_cflag=BAUDRATE | CS8 | CLOCAL | CREAD;
newtio.c_iflag = 0;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fp,TCIOFLUSH); // 清除发送缓冲区的资料
tcsetattr(fp,TCSANOW,&newtio); // 启动序列埠的设定。
unsigned char buf[2];
for(int i = 0; i < cmdStr.length()/2; i++)
{
buf[0] = hexCmd[i];
res += write(fp, buf, 1);
usleep(1);
}
cout << "Res =" << res << endl;
tcsetattr(fp,TCSANOW,&oldtio); // 回存旧的序列埠设定值
close(fp); // 关闭MODEMDEVICE
cout << "Done" << endl;
return 0;
}
以上麻烦各位前辈帮我看看
程式流程 或是 设定上有什么问题
另外 在网络上的程式码中
我发现有些程式这两个动作
tcsetattr(fp,TCSANOW,&oldtio);
close(fp);
有些是先做close 才回复设定
有疑问的地方在于 fp做了close之后
不是应该没有意义了吗
为什么还能够做tcsetattr呢
问题有点多 在这边先谢谢各位前辈了╭(─╴╴─)╮