※ 引述《nec716 (尼莫)》之铭言:
: 最近在尝试使用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;
加上CRTSCTS 或是 CNEW_RTSCTS看看
这是设定hardware flow control
有的硬件不支援或是丢太快仍有可能会掉资料
届时你可以在研究一下software flow control
: 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);
write的时候确认回传值是否真的写下去了
如果回传0没写不下去 因为chip或driver buffer满了
要多等晚点再写
另外建议你一次写多一点 不要这样间隔1us写
速度理论上还是靠硬件跟driver控制
你可以写到write回传比参数三 小的时候就小睡一下
or others
: 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呢
fclose后做确实是不太正确的
没有file handle理论上设不到driver
: 问题有点多 在这边先谢谢各位前辈了╭(─╴╴─)╮
设定细节可以参考
http://digilander.libero.it/robang/rubrica/serial.htm#3_1_1
看不懂的可以再问我看看