编写上位机软件和51通讯
请教下各位高手,我想写一个上位机和51通讯的软件,用什么语言比较好?是C++,还是VB。我自己会C语言,C++也了解点。
[解决办法]
还是用MFC吧,但是那里面的串口空间不那么好用。
关于串口通讯可以参阅龚建伟的书。
此书值得推荐。
[解决办法]
老大 给点分吧!
你会C的话。。怎么做都行,
但我劝你用C#。。
串口通信
C#上手 比较快 方便!
C++ 也行
我给你贴上点C++的代码。。 做个创建个对话框应用程序。
我给你贴些 代码 有可能 用上。。。
void CSerialPortDlg::OnBnClickedButtonConnect()
{
// TODO: 在此添加控件通知处理程序代码
DWORD IDThread;
OpenCom(_T("COM2"),9600,8,1,0);
hdcomThread=CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)ReadData, AfxGetMainWnd()->m_hWnd,0, &IDThread);//创建线程接收数据
}
void CSerialPortDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
DWORD Rlength;
char sendbuf[512]="";
//memset(sendbuf
UpdateData(true);
for(int i=0;i<SendData.GetLength();i++)
{
sendbuf[i]=SendData[i];
}
WriteFile(hdcom,sendbuf,(char)SendData.GetLength(),&Rlength,&ComOver);
ComError=GetLastError();
}
BOOL CSerialPortDlg::OpenCom(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity)
{
DCB dcb;
COMMTIMEOUTS CommTimeOuts;
hdcom=CreateFile(Port,GENERIC_READ
[解决办法]
GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); //打开串口
if(hdcom==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("!串口不存在或已被占用"));
return FALSE;
}
else
{
GetCommState(hdcom,&dcb);
dcb.BaudRate=BaudRate;
dcb.ByteSize=DataBits;
dcb.StopBits=StopBits;
dcb.Parity=Parity;
SetCommState(hdcom,&dcb);
SetupComm(hdcom,2048,2048);
SetCommMask(hdcom,EV_RXCHAR
[解决办法]
EV_TXEMPTY);
GetCommTimeouts(hdcom, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=10;
SetCommTimeouts(hdcom, &CommTimeOuts);
return true;
}
}
DWORD WINAPI ReadData(HWND hWnd)//主窗口句柄
{
/*CSerialPortDlg *pMy=(CSerialPortDlg *)hWnd;
pMy->ComError;
pMy->ComStat;
pMy->ReadFlag;
pMy->ComOver;
pMy->ComEvent;*/
char str[512]="";
DWORD wCount; //读取的字节数
DWORD wCount01;
memset(&ComOver,0,sizeof(OVERLAPPED));
ComOver.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
while(1)
{
Sleep(2);
ComEvent=0;
WaitCommEvent(hdcom,&ComEvent,&ComOver);
if((ComEvent&EV_RXCHAR)==EV_RXCHAR)//缓冲区中有数据到达
{
ClearCommError(hdcom,&ComError,&ComStat);
wCount=ComStat.cbInQue;////输入缓冲区有多少数据?
if(wCount>0)
{
ReadFlag=ReadFile(hdcom,&str,8,&wCount01,&ComOver);
str[wCount01]='\0';
if(!ReadFlag)
{
if(GetLastError()==ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hdcom,&ComOver,&wCount01,TRUE ))
{
ComError=GetLastError();
if(ComError==ERROR_IO_PENDING)continue; //缓冲区数据没有读完,继续
}
}
}
}
::PostMessage(hWnd,COM_RECVDATA,(unsigned int)str,wCount);//发送自定义消息给主线程,通知有数据到
ComEvent=0;
}
if(hdcom == INVALID_HANDLE_VALUE)
break;
}
return TRUE;
}
//接受
LRESULT CSerialPortDlg::DataRecv(WPARAM wParam, LPARAM lParam)
{
CString recvStr((char *)wParam);
RecvData += recvStr;
UpdateData(false);
return true;
}