我用脚本已经成功new出一个对象
var reader = new ActiveXObject("MsCommLib.MSComm");//创建com对象
但是不知道和串口通讯要调用什么函数我现在想要给串口发送一段指令,
然后将串口读取的数据得到返回应该怎么写啊?谢谢

解决方案 »

  1.   

    那还有什么别的什么玩法啊?
    我现在需要asp.net里实现客户端的串口读取
    不知道怎么办了
      

  2.   

    .建立项目  2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量4.在对话框中添加控件  5.添加串口事件消息处理函数OnComm()6.打开和设置串口参数7.发送数据8.发送十六进制字符9.在接收框中以十六进制显示10.如何设置自动发送11.什么是VARIANT数据类型?如何使用VARIANT数据类型?       这是串口调试助手源程序及编程详细过程(一)的续篇,首先谢谢朋友们的支持与鼓励。  8.发送十六进制字符    在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Caption: 十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend;    在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码; //由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
    //如:A1 23 45 0B 00 29
    //CByteArray是一个动态字节数组,可参看MSDN帮助
    int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)
    {
    int hexdata,lowhexdata;
    int hexdatalen=0;
    int len=str.GetLength();
    senddata.SetSize(len/2);
    for(int i=0;i<len;)
    {
    char lstr,hstr=str[i];
    if(hstr==' ')
    {
    i++;
    continue;
    }
    i++;
    if(i>=len)
    break;
    lstr=str[i];
    hexdata=ConvertHexChar(hstr);
    lowhexdata=ConvertHexChar(lstr);
    if((hexdata==16)||(lowhexdata==16))
    break;
    else 
    hexdata=hexdata*16+lowhexdata;
    i++;
    senddata[hexdatalen]=(char)hexdata;
    hexdatalen++;
    }
    senddata.SetSize(hexdatalen);
    return hexdatalen;
    }//这是一个将字符转换为相应的十六进制值的函数
    //好多C语言书上都可以找到
    //功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
    char CSCommTestDlg::ConvertHexChar(char ch) 
    {
    if((ch>='0')&&(ch<='9'))
    return ch-0x30;
    else if((ch>='A')&&(ch<='F'))
    return ch-'A'+10;
    else if((ch>='a')&&(ch<='f'))
    return ch-'a'+10;
    else return (-1);
    }   再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:void CSCommTestDlg::OnButtonManualsend() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE); //读取编辑框内容
    if(m_ctrlHexSend.GetCheck())
    {
    CByteArray hexdata;
    int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
    m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
    }
    else 
    m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据}
    现在,你先将串口线接好并打开串口调试助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00 01 02 03 A1 CC了。 9.在接收框中以十六进制显示    这就容易多了:  在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY Caption: 十六进制显示,再利用ClassWizard为其添加控制变量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg::OnComm()函数:void CSCommTestDlg::OnComm() 
    {
    // TODO: Add your control notification handler code here
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
    CString strtemp;
    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {
    variant_inp=m_ctrlComm.GetInput(); //读缓冲区
    safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
    len=safearray_inp.GetOneDimSize(); //得到有效数据长度
    for(k=0;k<len;k++)
    safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
    for(k=0;k<len;k++) //将数组转换为Cstring型变量
    {
    BYTE bt=*(char*)(rxdata+k); //字符型
    if(m_ctrlHexDisplay.GetCheck())
    strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
    else 
    strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放m_strRXData+=strtemp; //加入接收编辑框对应字符串 
    }
    }
    UpdateData(FALSE); //更新编辑框内容
    }测试:在串口调试助手发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00 01 02 03 A1 CC了。 10.如何设置自动发送     最简单的设定自动发送周期是用SetTimer()函数,这在数据采集中很有用,在控制中指令的传送也可能用到定时发送。    方法是:在ClassWizard中选上MessageMap卡,然后在Objects IDs选中CSCommTestDlg类,再在Messages框中选上WM_TIMER消息,单击ADD_FUNCTION加入void CSCommTestDlg::OnTimer(UINT nIDEvent) 函数,这个函数是放入“时间到”后要处理的代码:void CSCommTestDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    OnButtonManualsend();
    CDialog::OnTimer(nIDEvent);
    }
    再在在主对话框中加入一个复选接钮,ID为IDC_CHECK_AUTOSEND Caption: 自动发送(周期1秒),再利用ClassWizard为其添加BN_CLICK消息处理函数void CSCommTestDlg::OnCheckAutosend():void CSCommTestDlg::OnCheckAutosend() 
    {
    // TODO: Add your control notification handler code here
    m_bAutoSend=!m_bAutoSend;
    if(m_bAutoSend)
    {
    SetTimer(1,1000,NULL);//时间为1000毫秒
    }
    else
    {
    KillTimer(1);  //取消定时
    }
    }其中:m_bAutoSend为BOOL型变量,在CLASSVIEW中为CSCommTestDlg类加入,并在构造函数中初始化:      m_bAutoSen=FALSE;
    现在可以运行程序测试了。
      

  3.   

    Private Sub AxMSComm1_OnComm(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AxMSComm1.OnComm
            Dim strIn As String, bytIn() As Byte, i As Integer, str As String
            AxMSComm1.InputLen = 0
            Select Case AxMSComm1.CommEvent
                Case 1
                    Dim Buffer As Object
                    AxMSComm1.InputLen = 0
                    AxMSComm1.InputMode = MSCommLib.InputModeConstants.comInputModeBinary
                    Buffer = AxMSComm1.Input
                    System.Console.WriteLine("123:" & Buffer)
                Case 2
                    ''AxMSComm1.InputLen = 0
                    'bytIn = AxMSComm1.Input
                    'AxMSComm1.InBufferCount = 0
                    'For i = 0 To UBound(bytIn)
                    '    ' strIn += "\r\n" + " " + Hex(bytIn(i))
                    '    strIn = [String].Concat(strIn, System.Text.Encoding.Default.GetString(bytIn, i, 1))
                    '    'strIn = [String].Concat(strIn, System.Text.Encoding.Unicode.GetString(bytIn, i, 1))
                    'Next
                    'TextBox1.Text = TextBox1.Text + strIn
                    '    str = AxMSComm1.Input
                    '    TextBox1.Text = TextBox1.Text + str
                    'Case Else                '接收字符数据 
                    Dim Buffer As Object
                    AxMSComm1.InputLen = 0
                    AxMSComm1.InputMode = MSCommLib.InputModeConstants.comInputModeBinary
                    Buffer = AxMSComm1.Input
                    System.Console.WriteLine("接收的值:" & Buffer)
                    '接收二进制数据 
                    'MSComm1.InputMode = comInputModeText
                    'Buffer = MSComm1.Input
            End Select
            'If AxMSComm1.CommEvent = 2 Then
            '    'AxMSComm1.InputLen = 0
            '    bytIn = AxMSComm1.Input
            '    For i = 0 To UBound(bytIn)
            '        'strIn += "\r\n" + " " + Hex(bytIn(i))
            '        strIn = [String].Concat(strIn, System.Text.Encoding.Default.GetString(bytIn, 0, i))
            '    Next
            '    TextBox1.Text = strIn
            'Else        'End If    End Sub    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            With Me.AxMSComm1
                .CommPort = 1
                .Settings = "9600,N,8,1"
                '.InputMode = MSCommLib.InputModeConstants.comInputModeBinary
                .InputMode = MSCommLib.InputModeConstants.comInputModeBinary
                .SThreshold = 1
                .RThreshold = 1
                .OutBufferCount = 0
                .InBufferCount = 0
                .InputLen = 0
                .OutBufferSize = 1024
                .InBufferSize = 1024
            End With
            Try
                Me.AxMSComm1.PortOpen = True
                Dim bytIn() As Byte = AxMSComm1.Input()
            Catch ex As Exception
                MsgBox("串口操作失败!", MsgBoxStyle.Critical)
            End Try        Dim strNow As String = Now.ToString("yyyy-MM-dd HH:mm:ss")    End Sub    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim bytOut() As Byte = New Byte(1) {}
            bytOut(0) = &HF3
            bytOut(1) = &HA1
            'bytOut = System.Text.Encoding.Unicode.GetBytes(TextBox2.Text)
            'AxMSComm1.Output = bytOut
            AxMSComm1.Output = bytOut
        End Sub    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
            Me.AxMSComm1.PortOpen = False
        End Sub
    End Class
      

  4.   

    我是希望访问客户端的串口
    这个是不是只能用脚本做的?
    楼上贴的都是访问本地的串口的吧?我是要服务器端能得到客户端的串口数据,在asp.net中
      

  5.   

    方法一、用Socke编程
    方法二、在客户端调用服务器端串口。怎么调?  客户端执行一操作,程序在服务器上执行。
      

  6.   

    NO Way,你没有办法去做他的COm事件