剛剛學習上位機編程,用MSCOMM控制元件做了一個上位機,用定時器每個100MS發送資料00 55 ba 00 ff 45 每隔100MS發送00 55 fb。
用usb轉串口自發自收,收到的應該是55 fb 00 55 ba 00 ff 45 00。但收到的資料是變的,而且會有重復的,像收到很多ba。求大神幫忙看看代碼。
void PASCAL CallBackFunc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
CLinMasterNodeTestDlg* dlg = (CLinMasterNodeTestDlg*)dwUser;
if(!dlg->m_mscomm.GetPortOpen())
{
if(NOTopenCOMflagonce==0)
{
NOTopenCOMflagonce=1;
}
return;
}
if(stream==0)
{
dlg->m_mscomm.SetBreak(1);
stream=1;
}
else if(stream==1)
{
if(dlg->m_Frei.GetCheck())
{
LIN_txdata1|=1<<1;
}
else
{
LIN_txdata1&=~(1<<1);
}
if(dlg->m_Autark.GetCheck())
{
LIN_txdata1|=1<<0;
}
else
{
LIN_txdata1&=~(1<<0);
}
if(dlg->m_Vorw.GetCheck())
{
LIN_txdata1|=1<<2;
}
else
{
LIN_txdata1&=~(1<<2);
}
dlg->m_mscomm.SetBreak(0);
CByteArray array2;
static int x=0;
x++;
if(x&1)
{
array2.SetSize(5);
array2.SetAt(0,0x55);
T_u8 PIDresult=0;
PIDresult=IDconvertPID(58);
array2.SetAt(1,PIDresult);
array2.SetAt(2,LIN_txdata1);
array2.SetAt(3,Send59dataarray[1]);
Send59dataarray[0]=LIN_txdata1;
T_u8 Enhancecheksum1=0;
Enhancecheksum1=EnhancedChecksum(Send59dataarray,2,PIDresult);
array2.SetAt(4,Enhancecheksum1);
dlg->m_mscomm.SetOutput(COleVariant(array2));
}
else
{
//dlg->m_mscomm.SetOutBufferCount(0);
array2.SetSize(2);
array2.SetAt(0,0x55);
T_u8 PIDresult1=0;
PIDresult1=IDconvertPID(59);
array2.SetAt(1,PIDresult1);
dlg->m_mscomm.SetOutput(COleVariant(array2));
Requestflag=1;
}
delay=100;
stream=2;
}
else if(stream==2)
{
if(delay)
delay--;
else
{
stream=0;
//while(dlg->m_mscomm.GetOutBufferCount()>5);
//dlg->m_mscomm.SetSettings("19200,n,8,1");
//delay=100;
}
}
}
void CLinMasterNodeTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
unsigned char rxdata[30]; //設定BYTE陣列An 8-bit integerthat is not signed.
CString strtemp;
CString recd;
int arayindextemp=0;
static char recordlength=0;
//static char streamRx=0;
unsigned char rxarray[30];
// int rxdindex=0;
// int rxaindex=0;
// bool flag=0;
switch(m_mscomm.GetCommEvent())
{
case 1: // comEvSend發送資料
break;
case 2: // comEvReceive讀取資料
{
// MessageBox(_T("讀取資料事件"), _T("TRACE"), MB_OK);
variant_inp=m_mscomm.GetInput(); //讀緩沖區
safearray_inp=variant_inp; //VARIANT型變數轉換為COleSafeArray型變數
len=safearray_inp.GetOneDimSize(); //得到有效資料長度
// 接受資料
//m_www=len;
//UpdateData(0);
for(k=0;k<len;k++)
{
//unsigned char Hexchange=0;
safearray_inp.GetElement(&k,rxarray+k); //轉換為BYTE型陣列
}
if(Requestflag==1)
{
if(recordlength<9)
{
int templength=recordlength+len;
for(long u16=recordlength;u16<templength;u16++)
{
//safearray_inp.GetElement(&u16,rxarray+u16); //轉換為BYTE型陣列
aray[u16]=*(unsigned char*)(rxarray+(u16-recordlength));
recordlength++;
Watchstr.Format(_T("%02x"),aray[u16]); //十六進制顯示
Watchstrun+=Watchstr;
Watchstrun+=" ";
}
}
else
{
Requestflag=0;
m_qqqq=Watchstrun;
UpdateData(0);
Watchstrun=" ";
recordlength=0;
}
}
break;
}
uj5u.com熱心網友回復:
用原生串口試試看USB設備,本身是bulk方式的,小資料,多頻次,的情況下,效率很低,丟資料也有可能
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/78370.html
上一篇:MFC串口通信編程,MSCOMM讀取串口緩沖區資料失敗,VARIANT InputData = m_mscom.GetInput();這條陳述句之后的代碼都不執行
下一篇:mfc 向excel 中插入圖片
