虚拟机的串口突然接收不到消息,求大佬帮忙看看

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟机的串口突然接收不到消息,求大佬帮忙看看相关的知识,希望对你有一定的参考价值。

单片机一直往串口发数据,widow下串口没问题,但是连接到虚拟机上就读不到消息,最近突然这样,前段时间还ok
我的串口设备文件是ttyS1,大佬帮忙分析一下是什么原因照成的

虚拟机中的串口连接可以采用两种方法。一种是指定虚拟机的串口连接到实际的COM上,例如开发机连接到COM1,目标机连接到COM2,然后把两个串口通过串口线相连接。另一种更为简便的方法是:在较高一些版本的VMware中都支持把串口映射到命名管道,把两个虚拟机的串口映射到同一个命名管道。例如,在两个虚拟机中都选定同一个命名管道 \\.\pipe\com_1,指定target机的COM口为server端,并选择"The other end is a virtual machine"属性;指定development机的COM口端为client端,同样指定COM口的"The other end is a virtual machine"属性。对于IO mode属性,在target上选中"Yield CPU on poll"复选择框,development机不选。
串口是开发者经常要使用到的,我们有些时候需要使用windows开发,然而window装在了虚拟机中,我们怎么样在虚拟机中使用串口呢?
1、在virtualbox中选择启用串口,端口模式选择Host device.
由于现有两个系统但是只有一个物理串口,所以虚拟机要通过主机的串口文件间接获取数据,主机是linux,串口设备为/dev/ttyS0
2、端口/文件位置一栏填入:/dev/ttyS0,启动虚拟机。
3、如果无法启动虚拟机,很有可能是没有对ttyS0设备的读写权限,(可以ls -l /dev/ttyS0查看以下权限)于是我们要修改ttyS0的权限,在终端中输入:sudo chmod 777 /dev/ttyS0 这样就将ttyS0的所有权限都打开了。启动虚拟机,这时候就可以在虚拟机中(winXP)使用串口了。
参考技术A 在虚拟机安装目录如d:\program
files目录下,windows.iso
一般这个文件都是跟虚拟机版本对应并集成的,如果不考虑版本的问题可以到vmware.cn下载一个绿色版的,里面可以复制出windows.iso文件,或者我传给你~
安装vmware
tools也可以在安装虚拟机的操作系统后(如xp)在光驱设置里加载windows.iso光盘,然后再虚拟系统里面就可以跟放入光盘安装一样了
参考技术B 串口设备文件是ttyS
右击,计算机,管理,设备管理
查看com
改调COM2....

C++ socket传送和接收结构体问题,求大神帮忙

结构体:
struct SendPackage

char opcode[32];
char SendMessage[1024];
char ReturnMessage[1024];
char ReturnCode[2];
;
类:

class CSubscriber

public:
CSubscriber(CSubscriber &subs);
CSubscriber();
virtual ~CSubscriber();
char p_subsid[20+1];
char p_custid[20+1];
char p_Acctid[20+1];
char p_Userid[20+1];
char p_ServerNum[20+1];
char p_Subsname[50+1];
char p_Status[50+1];
;
客户端代码:
SendPackage SendBi;//结构体
strcpy(subs.p_subsid,"123456");//subs是CSubscriber的对象。
strcpy(SendBi.SendMessage,(char*)&subs);
int SendLength = send(p_ClientSocket,
(char*)&SendBi,
sizeof(SendPackage),
0);
服务端代码:
ReceiveLen=recv(p_NewSocket, // 新的套接字句柄
p_ReceiveBuffer, // 接收套接字的缓冲区
2060, // 缓冲区的大小
0); // 标志为 0

得到的buffer是个结构体,我就想得到subs.p_subsid

发送者: 把结构体对象 通过 序列化 变成二进制缓存,然后 传输这个缓存。

接受者: 把接受二进制缓存 通过序列化 再组建成结构体对象
这个是现在最通用的标准

建议你使用下boost::serialization
参考技术A 在服务端也要定义这样的结构体
结构体:
struct SendPackage

char opcode[32];
char SendMessage[1024];
char ReturnMessage[1024];
char ReturnCode[2];
;
然后:
ReceiveLen=recv(p_NewSocket, // 新的套接字句柄
p_ReceiveBuffer, // 接收套接字的缓冲区
sizeof(struct SendPackage) , // 缓冲区的大小
0);
struct SendPackage *p_stu = (struct SendPackage*)p_ReceiveBuffer ;
cout << "sbusid=" << p_stu->SendMessage ;

但是看你前面的程序,好象有点问题吧:
strcpy(subs.p_subsid,"123456");//subs是CSubscriber的对象。
strcpy(SendBi.SendMessage,(char*)&subs); //肿么能将一个CSubscriber的对象拷贝到一个字符数组中去呢?
参考技术B int SendLength = send(p_ClientSocket,
(char*)&SendBi,
sizeof(SendPackage),
0);

(char*)&SendBi, 换为subs.p_subsid,大小换位 sizeof(subs.p_subsid)追问

说白了,我是要传结构体而后去解析结构体。不是想传单纯的值

以上是关于虚拟机的串口突然接收不到消息,求大佬帮忙看看的主要内容,如果未能解决你的问题,请参考以下文章

虚拟机linux下用usb 转串口线,minicom连接SBC2410板,能接收数据,但是不能发送数据?

Oracle VM VirtualBox不能联网,求帮忙

定位虚拟机卡的原因

虚拟机里接收不到数据包,怎么设置?

VMware虚拟机的网络连接,如图所示。

从本地主机连接不到虚拟机里面的服务