现有一个项目是用PC和多机通信的,本来下位机可以采用方式1(用查询),可是我那怪同事非要用方式3,可是高手你知道用方式三是11位的数据格式,其中有一位是(地址/数据)位,即发地址时是‘1’,命令是‘0’,现在我要问的就是如何对这位编程?
其实我是用PB作界面的,想用VC做个DLL,因此要是那位高手有此DLL的话,那可否帮忙呀!

解决方案 »

  1.   

    得到这一位到不难
    定义一个结构体就能搞定
    typedef _DATAIN
    {
       int data:10;
       int cmd;1;
    }datain;
    这是一个示例,成员cmd就是这一位,
    具体根据你数据格式调整结构体(成员、位长,顺序)
      

  2.   

    xintiaf(日月紫光)兄,我不太明白你说的。
    qsfsea(囚鸟)兄,这样不太好理解吧!
      

  3.   

    另外注明一下:下位机用的是AT89C2051。
      

  4.   

    我也不记得方式3的数据格式是什么样的了,
    假设前最后一位是 地址/数据 位,可以定义这样的一个结构,
    然后定义变量:
    typedef struct _DATAIN
    {
       int data:10;
       int cmd;1;
    }DATAIN;
    DATAIN datain;
    读入的数放在datain里,
    处理时判断:
    if(datain.cmd)//是数据
    {       }//
    else    //是命令
    {       }//
    这样不就把命令和数据区别开了吗,我不知道你是不是这个问题
      

  5.   

    多谢xintiaf(日月紫光)兄,不过我还是想问一下您有做过和下位机通信的程序吗,因为我想你说的不太适合我的东西。
    我说的当然是指上位机编程,下位机就不用那么麻烦了!另外2051汇编我不太清楚,能说说?
      

  6.   

    咳,我没用过2051汇编,能给个程序,最好已做成dll的。
      

  7.   

    现在我找了些有关INTEL8250寄存器的内容,也知道了如何送出11位的通信格式:
    起始位+8位数据位+编程位(校验位)+停止位。可是我现在想问另外一个问题:
    我该如何获取下位机送上来的信号,在用MSCOMM的时候我可以用‘事件驱动’,我是不是就用:
    for(i=1;i<100000;i++)
    _inp(portaddress);
    那位大虾给我写段接受数据的程序,可以我一定结帐,谢谢!
      

  8.   

    你需要发送11位数据,你的通讯协议中要加入奇偶校验位的。你需要保证你的地址的奇偶校验为1,也就是说,你发送地址的时候,奇偶校验位为1。这样单片机就可以用方式3来接收了,单片机就知道接收的数据是地址,而不是命令。当你发送命令的时候,你要保证命令的奇偶校验位为0,这样单片机以方式3接收的时候,就知道这是命令,而不是地址了。
    建议你不要用mscomm控件,你应该找一个串口类,这样会更方便。如果你用mscomm控件,有很多数据你发送不了,不如说0x00,0xff的数据。
      

  9.   

    看来楼上是行中人,我现在不想用MSCOMM控件,因为用它无法完成11为数据格式(主要是不能对校验位编程)。另外我现在用的是_INP()和_OUTP()函数,其实我最终要形成一个DLL,在PowerBuilder中调用,可是你也知道用_INP()的话,你必须自己去接收数据,我不知道如何去接收数据。
      

  10.   

    _inp,_outp好像在2000中不能用了
      

  11.   

    如果你用_intp()和_outp()函数接收,你需要知道计算机上面每一个串口的物理地址,而且,这两个函数再win98下面可以用,但是在win2000下面就不能保证了。我没有使用过_intp()和_outp()函数做串口通讯。我觉得你应该去www.codeproject.com上面下载一个CSerialPort类,你也可以把它做成dll的。
      

  12.   

    下午我已经把发送的DLL写好了,现在就差接收的了,另外 nanjianhui(nan) 能提供一个用CSerialPort的例子吗(它也可以实现11位的数据格式,能对校验位编程?),谢谢,其实VC我不太懂。