首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

编写下位机软件和51通讯

2013-01-25 
编写上位机软件和51通讯请教下各位高手,我想写一个上位机和51通讯的软件,用什么语言比较好?是C++,还是VB。

编写上位机软件和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;
}

热点排行