我有个delphi程序,控件一个机器,写串口能返回数据,用的是SPCOMM
我用.NET,就返不回数据,我先后用了serialport ,MSCOM,和API,都不行,不知道是什么原因,请高手帮我看看,或者提供一个.NET的串口控件,谢谢.
这是我用API写的.
 // OPEN THE COMM PORT.   
            hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
            // IF THE PORT CANNOT BE OPENED, BAIL OUT. 
            if (hComm == INVALID_HANDLE_VALUE)
            {
                return ;
            }
            SetupComm(hComm, 4096, 4096);
            // SET THE COMM TIMEOUTS.
            COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();
            GetCommTimeouts(hComm, ref ctoCommPort);
            ctoCommPort.ReadIntervalTimeout = 100;
            ctoCommPort.ReadTotalTimeoutConstant = 0;
            ctoCommPort.ReadTotalTimeoutMultiplier = 0;
            ctoCommPort.WriteTotalTimeoutMultiplier = 0;
            ctoCommPort.WriteTotalTimeoutConstant = 0;
            SetCommTimeouts(hComm, ref ctoCommPort); 
 DCB dcbCommPort = new DCB();
            dcbCommPort.DCBlength = Marshal.SizeOf(dcbCommPort);
            GetCommState(hComm, ref dcbCommPort);
            dcbCommPort.BaudRate = 4800;
            dcbCommPort.Parity = 0;
            //dcbCommPort.ByteSize = byteSize; 
            dcbCommPort.ByteSize = 8;
            dcbCommPort.StopBits = 0;
            bool myb = SetCommState(hComm, ref dcbCommPort);            PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT);
            PurgeComm(hComm, PURGE_TXCLEAR | PURGE_TXABORT);            bOpened = true; 
 byte[] WriteBytes ={ 0x00, 0x1E, 0x0D, 0x0A };
            
            OVERLAPPED ovlCommPort = new OVERLAPPED();
            int BytesWritten = 0;
            WriteFile(hComm, WriteBytes, WriteBytes.Length, ref BytesWritten, ref ovlCommPort);

解决方案 »

  1.   

    对,用delphi 的SPCOMM控件就好使.
    用.NET的就不行,不知道为什么.
      

  2.   

    那就把delphi程序编译成dll,然后在C#中调用。
      

  3.   

    用控件之前首先要知道你连接的串口设备的通信参数和通信方式
    我用mscomm控件,在VC下用,Delphi下用,.Net下也用,目前还是正常的。串口API写起来太复杂,看起来累
      

  4.   

    delphi与.NET有些类型兼容性不好