我门单位开发的外设,要开发程序,现在外设的程序写在机器里面了,我要开发上位机程序,用VC+MSCOMM,请问如何:
1。发送控制代码例如"1D+C2+04+F0+24字节ASCII码+C0"到外设。
2。接收外设发回的确认代码"D1"。
以上的代码为十六进制我想要上面的VC代码,比较清楚的,里面最好不要有假代码.
懂了就给分!
1。发送控制代码例如"1D+C2+04+F0+24字节ASCII码+C0"到外设。
2。接收外设发回的确认代码"D1"。
以上的代码为十六进制我想要上面的VC代码,比较清楚的,里面最好不要有假代码.
懂了就给分!
解决方案 »
- 如何在软件中实现telnet功能,可以连接到unix服务器,实现对服务器的操作
- 如何部署ATL制作的ActiveX控件
- 如何给每个分割的窗口加标题栏?
- 请教一个文件读取修改的问题
- 如何通过编程设置"按钮"为default属性?
- 问一个简单的问题,高手帮帮忙
- 请看以下fread的问题,立刻给分
- archer_hao(格格巫) :可以把你那个画饼图的程序发给我吗?
- 添加的Property Sheet的类无法在ClassWizard中显示?
- Vc中用过crystal reports(水晶报表)的请进来。
- 如何改变disabled的edit框的字体颜色?
- 计算机串口设置为9600bps、奇校验时无法正常与MODEM进行AT指令设置吗?
[email protected]
void CSCommTestDlg::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];//设置BYTE数组
CString strtemp;
switch (m_ctrlComm.GetCommEvent())
{
case 1: //comEvSend事件
//如有数据要发送,可采用以下代码:
{
VARIANT varOut;
VariantInit(&varOut);
varOut.vt=VT_BSTR;
// USES_CONVERSION;
//varOut.bstrVal=(SysAllocString(T2OLE)("My data"));
if(varOut.bstrVal)
{
m_ctrlComm.SetOutput(varOut);
SysFreeString(varOut.bstrVal);
}
break;
} case 2: //comEvReceiv事件,有数据到达
{
variant_inp = m_ctrlComm.GetInput();//读缓冲区
safearray_inp = variant_inp;
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);//将字符以十六进制方式送入临时变量
else
strtemp.Format("%c", bt);//将字符送入临时变量strtemp存放
m_strRXData += strtemp;//加入接受编辑框对应字符串
}
UpdateData(FALSE);//更新编辑框的内容
break;
}
default:
break;
}
}
void CSCommTestDlg::OnButtonManualsend() //手动发送
{
if(!m_ctrlComm.GetPortOpen())
AfxMessageBox("串口未打开\n请先打开串口");
else
{
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字符数据
//m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
// TODO: Add your control notification handler code here
}
}void CSCommTestDlg::OnButtonOpen() //打开串口
{
UpdateData(TRUE);
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
//char buf[10];
//m_ctrlComm.SetCommPort(1);
int i = atoi(m_portId_Str);
m_ctrlComm.SetCommPort(i);
//m_ctrlComm.SetCommPort(m_Serial.GetCurSel());//选择comm1
if(!m_ctrlComm.GetPortOpen ())
{
m_ctrlComm.SetPortOpen(TRUE);
m_Open.ShowWindow(SW_HIDE);
m_Close.ShowWindow(SW_SHOW);
} else
AfxMessageBox("cannot open serial port");
char *buf1,*buf2,*buf3;
buf1=(LPSTR)(LPCTSTR)m_rate_Str;
buf2=(LPSTR)(LPCTSTR)m_data_Str;
buf3=(LPSTR)(LPCTSTR)m_stop_Str;
//int nLen = m_rate_Str.GetLength();
//LPCTSTR lpzsbuf =m_rate_Str.GetBuffer(nLen);
sprintf(buf1,"%s,n,%s,%s",buf1,buf2,buf3);//
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetSettings(buf1);
m_ctrlComm.SetPortOpen(TRUE);
//m_ctrlComm.SetSettings("m_rate_Com.GetCurSel(),m_bit_Com.GetCurSel(),m_data_Com.GetCurSel(),m_stop_Com.GetCurSel()");
//m_ctrlComm.SetInBufferSize(2048);
m_ctrlComm.SetInputMode(1);//表示以二进制方式剪取数据
m_ctrlComm.SetRThreshold(1);//表示每当串口接受区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetSThreshold(0);
m_ctrlComm.SetInputLen(0);//设置当前接受区数据长度为0
//使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
//m_ctrlComm.SetPortOpen(1);
//return m_Opened;
// TODO: Add your control notification handler code here
}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;
}
int 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);
}void CSCommTestDlg::OnTimer(UINT nIDEvent)
{
OnButtonManualsend();
// TODO: Add your message handler code here and/or call default
CDialog::OnTimer(nIDEvent);
}void CSCommTestDlg::OnCheckAutosend()
{
if(!m_ctrlComm.GetPortOpen())
{
AfxMessageBox("串口未打开,请先打开串口");
m_bAutoSend = !m_bAutoSend;
}
else
{
m_bAutoSend =!m_bAutoSend;
if(m_bAutoSend)
{
SetTimer(1, 1000, NULL);//时间为1000毫秒
m_AutoCL.SetSel(0,-1);
m_AutoCL.ReplaceSel("1000");
}
else
{
m_AutoCL.SetSel(0,-1);
m_AutoCL.ReplaceSel("");
KillTimer(1);
}
}
// TODO: Add your control notification handler code here
}void CSCommTestDlg::OnButtonClose() //关闭串口
{
if(m_bAutoSend )
AfxMessageBox("请先关闭自动发送");
else
{
m_Open.ShowWindow(SW_HIDE);
m_Close.ShowWindow(SW_SHOW);
m_ctrlComm.SetPortOpen(FALSE);
m_Open.ShowWindow(SW_SHOW);
m_Close.ShowWindow(SW_HIDE);
}
// TODO: Add your control notification handler code here
}void CSCommTestDlg::OnButtonCleart() //清空
{
m_strTXData.Empty();//清除接受对话框中的数据
UpdateData(FALSE);//DAO数据访问对象
// TODO: Add your control notification handler code here
}void CSCommTestDlg::OnButtonClearr()
{
m_strRXData.Empty();//清除发送对话框中的数据
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}void CSCommTestDlg::OnButtonExit()
{
m_Edit13.ShowWindow(SW_SHOW);
m_Exit.ShowWindow(SW_HIDE);
OnCancel();
// TODO: Add your control notification handler code here
}
//修改按钮void CSCommTestDlg::OnAmendButton()
{
if(m_ctrlComm.GetPortOpen())
{
m_ctrlComm.SetPortOpen(FALSE);
m_Open.ShowWindow(SW_SHOW);
m_Close.ShowWindow(SW_HIDE);
}
else
{
m_Serial.EnableWindow(TRUE);
m_data_Com.EnableWindow(TRUE);
m_rate_Com.EnableWindow(TRUE);
m_bit_Com.EnableWindow(TRUE);
m_stop_Com.EnableWindow(TRUE);
}
// TODO: Add your control notification handler code here
}
//使用按钮void CSCommTestDlg::OnAppButton()
{
UpdateData(TRUE);
m_Serial.EnableWindow(FALSE);
m_data_Com.EnableWindow(FALSE);
m_rate_Com.EnableWindow(FALSE);
m_bit_Com.EnableWindow(FALSE);
m_stop_Com.EnableWindow(FALSE);
//m_ctrlComm.SetPortOpen(TRUE);
// TODO: Add your control notification handler code here
}
不管是什么,包括发一个结构体,处理方法都是一样的这位老兄,你们单位做硬件的,你对硬件不熟悉,看来不好混呀,早点出来吧
int i=0;
CString str="";
m_comm.SetOutput(COleVariant("#0x001oo\r"));
while(str.Find('\r')==-1&&i<10000)
{str=str+m_comm.GetInput().bstrVal;
i++;
}