我看到论坛上有很多有关串口通信的问题,我再问一个,150分赠送哦! 现有一个项目是用PC和多机通信的,本来下位机可以采用方式1(用查询),可是我那怪同事非要用方式3,可是高手你知道用方式三是11位的数据格式,其中有一位是(地址/数据)位,即发地址时是‘1’,命令是‘0’,现在我要问的就是如何对这位编程?其实我是用PB作界面的,想用VC做个DLL,因此要是那位高手有此DLL的话,那可否帮忙呀! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 得到这一位到不难定义一个结构体就能搞定typedef _DATAIN{ int data:10; int cmd;1;}datain;这是一个示例,成员cmd就是这一位,具体根据你数据格式调整结构体(成员、位长,顺序) xintiaf(日月紫光)兄,我不太明白你说的。qsfsea(囚鸟)兄,这样不太好理解吧! 另外注明一下:下位机用的是AT89C2051。 我也不记得方式3的数据格式是什么样的了,假设前最后一位是 地址/数据 位,可以定义这样的一个结构,然后定义变量:typedef struct _DATAIN{ int data:10; int cmd;1;}DATAIN;DATAIN datain;读入的数放在datain里,处理时判断:if(datain.cmd)//是数据{ }//else //是命令{ }//这样不就把命令和数据区别开了吗,我不知道你是不是这个问题 多谢xintiaf(日月紫光)兄,不过我还是想问一下您有做过和下位机通信的程序吗,因为我想你说的不太适合我的东西。我说的当然是指上位机编程,下位机就不用那么麻烦了!另外2051汇编我不太清楚,能说说? 咳,我没用过2051汇编,能给个程序,最好已做成dll的。 现在我找了些有关INTEL8250寄存器的内容,也知道了如何送出11位的通信格式:起始位+8位数据位+编程位(校验位)+停止位。可是我现在想问另外一个问题:我该如何获取下位机送上来的信号,在用MSCOMM的时候我可以用‘事件驱动’,我是不是就用:for(i=1;i<100000;i++)_inp(portaddress);那位大虾给我写段接受数据的程序,可以我一定结帐,谢谢! 你需要发送11位数据,你的通讯协议中要加入奇偶校验位的。你需要保证你的地址的奇偶校验为1,也就是说,你发送地址的时候,奇偶校验位为1。这样单片机就可以用方式3来接收了,单片机就知道接收的数据是地址,而不是命令。当你发送命令的时候,你要保证命令的奇偶校验位为0,这样单片机以方式3接收的时候,就知道这是命令,而不是地址了。建议你不要用mscomm控件,你应该找一个串口类,这样会更方便。如果你用mscomm控件,有很多数据你发送不了,不如说0x00,0xff的数据。 看来楼上是行中人,我现在不想用MSCOMM控件,因为用它无法完成11为数据格式(主要是不能对校验位编程)。另外我现在用的是_INP()和_OUTP()函数,其实我最终要形成一个DLL,在PowerBuilder中调用,可是你也知道用_INP()的话,你必须自己去接收数据,我不知道如何去接收数据。 _inp,_outp好像在2000中不能用了 如果你用_intp()和_outp()函数接收,你需要知道计算机上面每一个串口的物理地址,而且,这两个函数再win98下面可以用,但是在win2000下面就不能保证了。我没有使用过_intp()和_outp()函数做串口通讯。我觉得你应该去www.codeproject.com上面下载一个CSerialPort类,你也可以把它做成dll的。 下午我已经把发送的DLL写好了,现在就差接收的了,另外 nanjianhui(nan) 能提供一个用CSerialPort的例子吗(它也可以实现11位的数据格式,能对校验位编程?),谢谢,其实VC我不太懂。 CEdit的SetSel问题 关于CSting类格式化输出的问题 如何限制WINDOWS下鼠标光标的移动范围 vc CListCtrl 锁定行头 在MFC中如何实现服务器断开客户端 ftp中实现传文件 两个const到底哪个修饰指针,哪个修饰引用呢?(详见内容) 紧急求助!关于VC.NET窗体设计器。郁闷! 求助!关于对话框的问题 晕,如何从屏幕上取一部分到一个BITMAP类中? 在多文档中,我另建了个Dialog类,我怎么在这个类中得到CView得指针? 还有个问题:如何使无标题栏对话框在任务栏上点击时实现最大公、最小化?
定义一个结构体就能搞定
typedef _DATAIN
{
int data:10;
int cmd;1;
}datain;
这是一个示例,成员cmd就是这一位,
具体根据你数据格式调整结构体(成员、位长,顺序)
qsfsea(囚鸟)兄,这样不太好理解吧!
假设前最后一位是 地址/数据 位,可以定义这样的一个结构,
然后定义变量:
typedef struct _DATAIN
{
int data:10;
int cmd;1;
}DATAIN;
DATAIN datain;
读入的数放在datain里,
处理时判断:
if(datain.cmd)//是数据
{ }//
else //是命令
{ }//
这样不就把命令和数据区别开了吗,我不知道你是不是这个问题
我说的当然是指上位机编程,下位机就不用那么麻烦了!另外2051汇编我不太清楚,能说说?
起始位+8位数据位+编程位(校验位)+停止位。可是我现在想问另外一个问题:
我该如何获取下位机送上来的信号,在用MSCOMM的时候我可以用‘事件驱动’,我是不是就用:
for(i=1;i<100000;i++)
_inp(portaddress);
那位大虾给我写段接受数据的程序,可以我一定结帐,谢谢!
建议你不要用mscomm控件,你应该找一个串口类,这样会更方便。如果你用mscomm控件,有很多数据你发送不了,不如说0x00,0xff的数据。