重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
设备与单片机串口通信程序,写了两个线程SendThread 和ReadThread,单击发送按钮发送线程发送一组命令数据到单片机,单片机再返回一组数据,读线程把数据显示在编辑框里。求解怎么才能设置单击一次按钮,实现比如1分钟内发送600次数据,接收600次呢。
创新互联建站专业为企业提供鄯善网站建设、鄯善做网站、鄯善网站设计、鄯善网站制作等企业网站建设、网页设计与制作、鄯善企业网站模板建站服务,10余年鄯善做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
C/C++ code?
LONG OnSendComm(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
return TRUE;
}
BYTE ConvertHexChar(BYTE 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;}
DWORD WINAPI SendThread (PVOID pArg) {
HWND hwndSText;
DWORD cBytes;
WCHAR szText[TEXTSIZE];
WCHAR szText1[TEXTSIZE];
WCHAR szText2[TEXTSIZE];
WCHAR szTextt[TEXTSIZE];
WCHAR szTexto[TEXTSIZE];
char szAnsi[TEXTSIZE];
size_t siz;
BYTE tmpByte=0x00;
int strLen=sizeof(szAnsi)-1;
BYTE cmd[TEXTSIZE];
byte cmd1,cmd2;
memset(cmd,'\0',sizeof(cmd));
hwndSText = GetDlgItem (hwnd, ID_SENDTEXT);
for(int i=0;i599;i++){ //发送600次 每次间隔100ms
Sleep(100);
if(WaitForSingleObject(g_hSendEvent,-1)==WAIT_OBJECT_0)
{
// 获得发送内容并转换成asci码
GetWindowText (hwndSText, szText, dim(szText));
swscanf(szText,L"%[^ ]",szText1);
swscanf(szText,L"%*s%s",szText2);
byte cmd1=wcstol(szText1,NULL,16);
limit=wcstol(szText2,NULL,10);
byte cmd2=0x68+0xA1+0x04+cmd1;
wsprintf(szTexto,L"%02X",cmd2);
wsprintf(szTextt,L"68 a1 04 %s %s",szText1,szTexto);
wcstombs_s (siz, szAnsi, sizeof (szAnsi), szTextt, _TRUNCATE);
for(int i=0,j=0;i64,jstrLen;i++,j++)
{
if(szAnsi[j]==' ')
++j;
tmpByte=szAnsi[j];
cmd[i]=ConvertHexChar(tmpByte)4;
if(szAnsi[++j]==' ')
++j;
tmpByte=szAnsi[j];
cmd[i]=cmd[i]+(ConvertHexChar(tmpByte)0xF);
}
你可以这样操作:
Form1.BeginInvoke(Sub()
'一些操作
End Sub)
这样主线程就会放下手里的事情并执行Sub里的操作了
不知道你是不是用51单片机往串口发数据,是的话那是因为51的sbuf最多存放8个字节,所以你发12个字节会分成两次发完。还有在接收的时候最好定义好通信协议,比如加一个侦头,一个侦尾,通过这两个字节的内容来接收数据。
老兄,提问还是给点悬赏分嘛,不要吝啬哪点分,知识是无价的,你给得越多,回答你的人才会越多。
上面的代码看不出问题,如果初始化串口控件时已经注册了AxMSComm1_OnComm,有数据接收应该能触发,至于为什么没有触发,要看看你的接收方是否已经收到你的发出指令,是否已经有响应数据回发。
建议分开调试,用一个通用的串口助手,如格西烽火串口助手之类的,分别调试你的上位机和下位机。格西烽火串口助手能轻松的定制如你上面的发送数据。