厂家的说明有一个C的例子,我看得不是很懂请解释一下。各位XDJM,谢谢了。void SioInit_1(void)
{
   outportb(com1_addr+2,0xcf);/*Enable fifo and clear fifo*/这里我想知道用MSCOMM控件的话这个功能怎么实现?
   outportb(com1_addr+3,0x80);   /*set bps*/
   outportb(com1-addr,baud_rate % 256);
   outportb(com1-addr+1,baud_rate / 256);
   outportb(com1_addr+3,bit_8|stop_1|0x28);
   outportb(com1_addr+1,0x00);/*disable interrupt*/这里用MSCOMM怎么实现?
}再次谢谢。。

解决方案 »

  1.   


    http://franson.biz/serialtools/index.asp?ref=google
      

  2.   

    参考--Serial COM Simply in C#:
    http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320
      

  3.   

    jinbingg(bing) :
    没有听说过。。可能你的笔记本有问题
    ----------------------------------指的什么呀?
    我的笔记本有问题?因为有问题了才能不用关闭串口就可以改变串口设置吗?
      

  4.   

    不要让我---参考---了行吗?
    直接回答我吧:
    1.可以不关串口就改变串口设置吗?
    2./*Enable fifo and clear fifo*/用MSCOMM控件的话这个功能怎么实现?
    3./*disable interrupt*/用MSCOMM怎么实现?
      

  5.   

    1 可以不关串口就改变串口设置吗?,可以
    2 Enable fifo and clear fifo ,设置先进先出,mscomm本来就是这样。
    3 ./*disable interrupt*/  是否可以立即中断,mscomm中好像没有吧,
    “中间间隔不能超过20ms”是什么意思,如果超过了会怎样?
      

  6.   

    回复人: mjun007(慧通特工) :
    1 可以不关串口就改变串口设置吗?,可以
    ...可是如果这样不关串口就改设置的话我在好几台机器上试了都一直没有数据返回.相反我关了再设置的话有时却可以返回数据.但是用USB转串口线接在USB上的话不关串口就设置却能一点不掉地返回数据.我现在迷糊了.各位指点指点.谢谢.
      

  7.   

    不关闭串口改变设置是可以的.问题是,如果不改变设置,发两个命令过去会如何?
    一般需要发送多次命令的设备,每发一次过去,都会有一个应答,正确应答以后才可能发下一条指令让它做下去.这个应答有么?
    如果是收不到应答,一般是由于超时引起的.那么程序的执行序列对么?代码的执行时间够短么?我也曾经碰到过类似问题,后来调整了代码效率就好了。
    还有一种可能就是你接收的部分有问题,也许条件限定太严了,可以把所有返回都显示一下看看.
    其他的几个设置问题,如果用MSCOMM,似乎没有必要多考虑.
      

  8.   

    至于执行时间.我觉得应该够短的吧.
    代码如下了(模拟):
    if mscomm.close 
       MSCOMM.OPEN
    MSCOMM.SETING = "9600,M,8,1"
    MSCOMM.OUTPUT = ADDR
    MSCOMM.SETING = "9600,S,8,1"
    MSCOMM.OUTPUT = 命令字
    一次命令过程结束.
      

  9.   

    有尾"0xAA",算是没头吧,头是发过去的ADDR.
    因为规定了返回字节长度,所以我就只等长度一够就取回来了,取回后再看ADDR,命令类型,结束等等,如果不合就报相应的错.因为等待时间我可以设置的,但无论设置多长,10s,20s都不行,返回的长度为0(大部分时间),偶尔也有正确的.厂商程序是可以接啊.所以我就怀疑我的程序,但也只能是在这里了吧?接收应该不会有什么问题呀.为什么怀疑关闭与不关闭串口再进行设置是因为我如果用笔记本去测试(笔记本没有串口所以用的是USB转串口线)的话不关串口就设置并发命令能够完全正确地返回数据.但是把这程序放到现场工控机上就不行了.一次数据也不能返回.然后用先关串口再设置的话则偶尔能返回数据.你觉得应该是什么问题呢?谢谢.
      

  10.   

    diable interrupt就是不允许在Send Data时中断,所以那样就是你传完数据,才让你设的Setting
      

  11.   

    还是直接调用串口API函数吧,用MSCOMM可能会有问题.
      

  12.   

    1 "不允许在Send Data时中断"你可以判断mscomm的outbuffercount属性嘛,如果大于0就是有数据。
    2 "只等长度一够就取回来了",现在这样,每就收一个字节都保存,可以放在一个文件,看看是否在每次因接收不到完整的数据都被认为是没接收到数据。
      

  13.   

    ----------------------------------------------
    1 "不允许在Send Data时中断"你可以判断mscomm的outbuffercount属性嘛,如果大于0就是有数据。
    ----------------------------------------------
    不好意思,没看懂这句的意思.OUTBUFFERCOUNT大于是发送区有数据,这跟中断是什么关系?----------------------------------------------
    2 "只等长度一够就取回来了",现在这样,每就收一个字节都保存,可以放在一个文件,看看是否在每次因接收不到完整的数据都被认为是没接收到数据。
    ----------------------------------------------我没有用MSCOMM的接收事件,我是发送完命令后自己去检测INBUFFERCOUNT,如果够长度就全取回.
    但是每次其长度都是0,应该说是没有数据返回呀.
      

  14.   

    看了以上的回复,可能有以下几种可能:
    1.两次命令发送间隔大于20ms,超时.比如工控机上有监控和你的程序抢时间.
    2.mscomm控件设置有问题.比如inbuffersize,inputmode之类的东东.
    3.机器设置有问题.我们也大量使用工控机的,有时候为了满足某方面的需求,工控机的设置和一般PC不同.暂时也只能想到这里了:S
      

  15.   

    using System.Data;
    using AxMSCommLib;
    using MSCommLib;
    namespace DBcom

    /// <summary>
    /// ComTerm 的摘要说明。
    /// </summary>
    public delegate void ChangedEventHandler(object sender, string c);
    public class ComTerm
    {
    MSComm com = new MSComm();
    public event ChangedEventHandler Changed; //定义一个事件用委托来处理

    public ComTerm()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    com.OnComm += new MSCommLib.DMSCommEvents_OnCommEventHandler(this.Receive);
    InitComPort(2,9600);
    } //to call underlying com class/method to send command to com port   **
    public bool Send(string sSendMsg) //
    { //
    if(sSendMsg != "") //
    { //
    com.Output = sSendMsg; //
    return true; //
    } //
    else //
    return false; //
    } //
    //*************调用以下  com类/以将命令发送到 com 口 *****************

    //close com port
    //Receive method to receive data from underlying class from com port
    public void Receive()   //
    {

    if (Changed != null)
    {
    if(com.InBufferCount > 0)////
    {
    string strAnalyze = com.Input.ToString();

    Changed(this,strAnalyze);
    }
    }


    } public void InBufferCountClear()
    {
    com.InBufferCount = 0;
    }
    //叫串口滚
    public void comClose()
    {
    if(com.PortOpen)
    com.PortOpen = false;
    }

    //}  public string comdata(string input)
    {
       
    string putin = (input + "\n");
    return putin;
    }

    //*************  接收方法从一个串口的优先类接收数据 ****************
     

    private void OnComm(object sender, EventArgs e)  //  MSCommLib OnComm Event Handler
    {
    // If data is waiting in the buffer, process it.
    // Note: This is using the string method for simple data, be sure
    //       to use byte arrays (described below) for more generic data.
    if (com.InBufferCount > 0) 
    com.Input.ToString();
    }
    //PortSetting to setup port parameter such as portNumber and baudRate etc
    //设置端口参数,如端口号和波特率等
    public void InitComPort(short iPort,int iBaudRate)
    {
    // This port is already open, close it to reset it.
    /*if(com.PortOpen)
    {
    throw(new ApplicationException("This port has already been opened!"));
    }*/
    if (com.PortOpen) 
    com.PortOpen = false; // Set the com port to be 1
    //设置端口号
    com.CommPort = iPort;   
    // Trigger the OnComm event whenever data is received
    com.RThreshold = 1;  
    // Set the port to 9600 baud, no parity bit, 8 data bits, 1 stop bit (all standard)
    com.Settings = iBaudRate + ",n,8,1"; // Force the DTR line high, used sometimes to hang up modems
    com.DTREnable = true;
        
    // No handshaking is used
    com.Handshaking = MSCommLib.HandshakeConstants.comNone; // Don't mess with byte arrays, only works with simple data (characters A-Z and numbers)
    com.InputMode = MSCommLib.InputModeConstants.comInputModeText;
        
    // Use this line instead for byte array input, best for most communications
    com.InputMode = MSCommLib.InputModeConstants.comInputModeText;
        
    // Read the entire waiting data when com.Input is used
    com.InputLen = 0; com.OutBufferSize = 1024; // Don't discard nulls, 0x00 is a useful byte
    com.NullDiscard = false;
    // Attach the event handler
    //com.OnComm += new System.EventHandler(this.OnComm);
    //com.OnComm += new MSCommLib.DMSCommEvents_OnCommEventHandler(this.OnComm);
    // Open the com port
    try
    {
    com.PortOpen = true;  
    com.OnComm += new MSCommLib.DMSCommEvents_OnCommEventHandler(this.Receive);
    }
    catch (Exception e)
    {
    Console.WriteLine("{0} Exception caught.", e);
    }
     
    //com.Changed += new ChangedEventHandler(ReceiveData);
    }
    }
    }
      

  16.   

    楼上的程序在一次命令中只有一次设置串口吧?
    我现在的程序是要在发送一条命令时会两次设置串口参数(MSCOMM.SETTING的值).只设置一次的时候程序没问题啊.
      

  17.   

    "不允许在Send Data时中断"你可以判断mscomm的outbuffercount属性嘛,如果大于0就是有数据。
    我是说既然不允许在Send Data(发送数据)时中断,发送数据后如果outbuffercount属性大于1,就是还在发送数据,所以不能中断,否会出现异常。
      

  18.   

    楼主翻翻以前的贴。有封装好的C#掉api读串口的。你继承,添加个监听线程操作就可以了。间隔自己订,10ms也可以做到,随便多长时间的thread.sleep()你的监听串口的线程。收到数据就触发个事件,为了保持一直,也可以叫OnComm么。
      

  19.   

    不嫌麻烦的话我发个vb.net做的串口类给你。[email protected]
      

  20.   

    wuyazhe(Love Is A Word.) 
    你好,我用以下信箱给你发信了,不知道能不能收到[email protected]
    [email protected]你发一个给我吧.谢谢.