
/***************以下是打開串口的代碼**********************/
void C串口通信Dlg::OnBnClickedButtonOpen()
{
CString str, str1, n;
GetDlgItemText(IDC_BUTTON_OPEN,str);
CWnd *h1;
h1 = GetDlgItem(IDC_BUTTON_OPEN);
if (!m_mscom.GetPortOpen())
{
m_mscom.SetCommPort(m_comb1.GetCurSel() + 1);//選擇串口
if (!m_mscom.GetPortOpen())
m_mscom.SetPortOpen(TRUE);//打開串口
else
MessageBox(_T("cannot open serial port"));
m_comb2.GetLBText(m_comb2.GetCurSel(), str1);//獲取所選擇到的波特率將其放入到str1中
str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1';//這句話很關鍵
m_mscom.SetSettings(str1);//設定波特率
m_mscom.SetInputMode(1);//設定輸入方式1 為二進制輸入方式
m_mscom.SetRThreshold(1);//緩沖區》=1個字符觸發事件
m_mscom.SetInputLen(0);//設定當前接識訓沖區資料長度為1024
//m_mscom.SetRTSEnable(1);//設定RT允許
if (m_mscom.GetPortOpen())
{
str = "關閉串口";
UpdateData(true);
h1->SetWindowText(str);
}
unsigned char InstStartRs[14] = { 238, 170, 01, 0, 01, 01, 0, 0, 01, 0, 0, 0, 0, 187 };
SendDataToCom(InstStartRs);
m_mscom.GetInput();//先預讀緩沖區以清除殘留資料
}
else
{
m_mscom.SetPortOpen(false);
if (str != "打開串口")
{
str = "打開串口";
UpdateData(true);
h1->SetWindowText(str);
}
}
}
/*****************發送資料的代碼*************************/
void C串口通信Dlg::OnBnClickedButtonSend()//發送資料的按鈕
{
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true);
m_mscom.SetOutput(COleVariant(m_Editsend));
}
/***********************接收到資料觸發OnCommMscomm1()事件***********************/
void C串口通信Dlg::OnCommMscomm1()
{
// TODO: 在此處添加訊息處理程式代碼
VARIANT InputData;
COleSafeArray fs;
BYTE rxdata[1024] = {0};
long len,k;
if (m_mscom.GetCommEvent() == 2)
{
InputData = m_mscom.GetInput();//讀緩沖區
fs = InputData;//VARIANT型變à量轉換為COleSafeArray型變數
len = fs.GetOneDimSize();
for (k = 0; k < len; k++)
fs.GetElement(&k, rxdata + k);//轉換為BYTE型陣列
BYTE bt;
for (k = 0; k < len; k++)//將陣列轉化為CString型變數
{
bt = *(rxdata+k);
OnComByte(bt);
}
UpdateData(false);
}
}
void C串口通信Dlg::OnComByte(byte data)
{
if (data == 0xee && End_RData_Flag)
{
HeadFlag = true; // 檔案頭收到
m_nRxDataLength = 0;
m_strRXDataCOM[0] = data & 0xff;
End_RData_Flag = false;
}
else if (HeadFlag && data == 0xff)
{
Start_Rece_Flag = true;// 可以接收資料了
m_strRXDataCOM[1] = data & 0xff;
m_nRxDataLength = 2;
HeadFlag = false;
}
else if (Start_Rece_Flag && (!HeadFlag))
{
m_strRXDataCOM[m_nRxDataLength] = data & 0xff;
m_nRxDataLength++;
}
if (m_nRxDataLength == 18)
{
End_RData_Flag = true;
m_nRxDataLength = 0;
HeadFlag = false;
Start_Rece_Flag = false;
START_FLAG = true;
}
}
void C串口通信Dlg::SendDataToCom(unsigned char InstSend[14])
{
CByteArray hexdata;
for (int k = 0; k <= 14; k++)
hexdata.Add(InstSend[k]);
hexdata.SetSize(14);
m_mscom.SetOutput(COleVariant(hexdata)); //發送十六進制資料
}
uj5u.com熱心網友回復:
哪位大神使用過MSCOMM串口通信的麻煩給我指導一下!謝謝uj5u.com熱心網友回復:
推薦使用串口除錯助手。uj5u.com熱心網友回復:
您好,這個問題解決了嗎,能說下怎么解決的嗎uj5u.com熱心網友回復:
BYTE rxdata[1024]for (k = 0; k < len; k++)
fs.GetElement(&k, rxdata + k);
當 len 大于1024時 有越界問題
uj5u.com熱心網友回復:
大兄弟,請問你串口接受資料的那部分解決了嗎。。。怎么解決的啊。。求教啊uj5u.com熱心網友回復:
str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1';//這句作用是什么呢?哪位大神給個回復uj5u.com熱心網友回復:
這句話就是:波特率引陣列合uj5u.com熱心網友回復:
一般來講如果用虛擬串口除錯可以接受的話那么你,就下位機的串口線驅動換一個新的。一般是驅動的問題uj5u.com熱心網友回復:
請問樓主問題解決了嗎?遇到一樣的問題getinput就退出了訊息接收函式uj5u.com熱心網友回復:
這種東西都是靠自己除錯的,先分離一下問題: 先用虛擬串口除錯上位機程式,然后再除錯下位機程式,看看問題在哪里。
uj5u.com熱心網友回復:
InputData = m_mscom.GetInput();//讀緩沖區,應該是此處發生了com錯誤,你沒有使用try catch,因此錯誤遞交到上級處理,故你其后的代碼沒有在執行
你使用try catch看看能否捕捉到錯誤
uj5u.com熱心網友回復:
這位客官用看到雞啄米的教程吧uj5u.com熱心網友回復:
表示遇到同樣的問題,我接了兩個USB轉串口,但我的只是針對某個串口,換個串口就可以接收了。但是下載的串口助手兩個串口都可以正常接收資料。uj5u.com熱心網友回復:
str1是波特率,n表示沒有校驗位,8是8個資料位,1表示1個停止位
uj5u.com熱心網友回復:
是不是接收的閾值 沒有設定啊! 默認是0好像不回應接收資訊!改成1可以在屬性框里手動改,也可以用代碼改!
uj5u.com熱心網友回復:
void CTabPage1::readComm2(CByteArray& arr){
if(h_mscomm1.get_PortOpen()){
if(h_mscomm1.get_InBufferCount()>0)
{
h_mscomm1.put_InputMode(1); //二進制模式輸入
VARIANT var1;
COleSafeArray arr1;
var1=h_mscomm1.get_Input();
arr1=var1;
DWORD len=arr1.GetOneDimSize();
long i=0;
for(;i<len;i++)
{
BYTE byte_1;
arr1.GetElement(&i,&byte_1);
arr.Add(byte_1);
}
h_mscomm1.put_InBufferCount(0); //清空接識訓沖區
}
}
}
CString CTabPage1::readComm()
{
CString str1=_T("");
if(h_mscomm1.get_PortOpen()){
if(h_mscomm1.get_InBufferCount()>0)
{
h_mscomm1.put_InputMode(0); //文本模式輸入
VARIANT val=h_mscomm1.get_Input();
str1=val.bstrVal;
h_mscomm1.put_InBufferCount(0); //清空接識訓沖區
}
}
return str1;
}
void CTabPage1::writeComm(CByteArray& arr)
{
if(h_mscomm1.get_PortOpen()){
h_mscomm1.put_OutBufferCount(0); //清空發送緩沖區
h_mscomm1.put_InputMode(1);
h_mscomm1.put_Output(COleVariant(arr));
}
}
void CTabPage1::writeComm(CString str)
{
if(h_mscomm1.get_PortOpen()){
h_mscomm1.put_OutBufferCount(0); //清空發送緩沖區
h_mscomm1.put_Output(COleVariant(str));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/78369.html
標籤:基礎類
