我用脚本已经成功new出一个对象
var reader = new ActiveXObject("MsCommLib.MSComm");//创建com对象
但是不知道和串口通讯要调用什么函数我现在想要给串口发送一段指令,
然后将串口读取的数据得到返回应该怎么写啊?谢谢
var reader = new ActiveXObject("MsCommLib.MSComm");//创建com对象
但是不知道和串口通讯要调用什么函数我现在想要给串口发送一段指令,
然后将串口读取的数据得到返回应该怎么写啊?谢谢
解决方案 »
- 正则表达式的格式
- ajax赋值给aspx页面控件值。然后cs取值为空??在线等!
- 做一个web的聊天室,有什么好建议或例子呢?
- 字符串中含有某些字符
- 项目文件和解决方案文件有什么区别?
- treeview显示部分节点问题,高手指教
- 懂IIS和VS2008的ASP.NET的高手进来帮忙下啦~~~
- commandtimeout 在那裡設置啊?怎麼設置啊? !!!!!!!!!!!!!!!!!!!!!!!!!!
- gridview列自动计算
- ocx获取参数问题:我使用了一个ocx控件,这个控件需要通过传入不同的参数,以显示不同的画面...
- ==============XML前台显示问题,求助大家呀=======
- 一 DataGrid 问题
我现在需要asp.net里实现客户端的串口读取
不知道怎么办了
//如: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;
现在可以运行程序测试了。
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
这个是不是只能用脚本做的?
楼上贴的都是访问本地的串口的吧?我是要服务器端能得到客户端的串口数据,在asp.net中
方法二、在客户端调用服务器端串口。怎么调? 客户端执行一操作,程序在服务器上执行。