请教串口通讯方面的问题 请问VC(MFC或API编程)下支不支持非标准通讯速率,如100000bps这样的速率?如果支持,请问怎么设定通讯速率? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 支持直接将波特率设置为100000设置过程:设用MSComm控件:CIIBMSComm m_comm;if(m_comm.GetPortOpen())//关闭端口m_comm.SetPortOpen(FALSE); m_comm.SetCommPort(PortNo);//设置端口号 if(parity) m_TempPortSetting=BaudRadio+",n,"+databit+",1";//设置端口传输方式 else m_TempPortSetting=BaudRadio+",n,"+databit+",1";m_comm.SetSettings(m_TempPortSetting);m_comm.SetInputMode(comInputModeBinary);//以二进制形式接受数据 m_comm.SetPortOpen(TRUE);//打开端口 m_comm.SetRThreshold(1);//设置响应端口接收事件的条件 m_comm.SetInputLen(0);//清楚输入缓冲区 m_comm.GetInput(); 用API函数SetCommState():HANDLE m_hCom=CreateFile( m_pPortParam->cCom ,GENERIC_READ|GENERIC_WRITE,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);DCB dcb;dcb.DCBlength=sizeof(DCB);GetCommState(m_hCom,&dcb)dcb.BaudRate=100000 ; //现实中可没有设备支持这么高的速度噢^_^SetCommState(m_hCom,&dcb);关于这些函数的具体用法,需要去查一下MSDN啦。 BaudRadio为CString类型BaudRadio="1000000"; 不好意思,刚才有两处错误:一个是CreateFile里面的第一个参数,不应该是m_pPortParam->cCom,应该是:"COM1"。另一个就是我加的那句注释,100000这个速度还是能支持的,我给多数了个0^_^,数学学得不好^_^。 我是用控件做的接收程序,用了mousefj(冯杰) 的方法,是可以编译通过的,也可以运行,但在运行前会跳出“Invalid property value”,请问这如何避免? 引入MSComm通过Project/add to project/companent and control设引入后的类名称为CMSComm,应用是定义的对象CMSComm m_ComCtl;初始化代码void CTestcomDlg::OnButton1() { // TODO: Add your control notification handler code here m_ComCtl.SetCommPort(1); if(!m_ComCtl.GetPortOpen()) m_ComCtl.SetPortOpen(TRUE); m_ComCtl.SetSettings("9600,n,8,1"); m_ComCtl.SetInputMode(0); m_ComCtl.SetInBufferCount(0); m_ComCtl.SetRThreshold(9); Sleep(1000); MessageBox("You initial COM port sucessfully","MessageBox",MB_OK);}请实施看能否通过。我这是运行正常的。 然后将m_ComCtl.SetSettings("9600,n,8,1");改为m_ComCtl.SetSettings("100000,n,8,1");再试试。 发送代码:void CTestcomDlg::OnButton2() { // TODO: Add your control notification handler code here /*tempstr.Insert(0,164); m_ComCtl.SetOutput(COleVariant(tempstr));*/ CByteArray m_TempArray; m_TempArray.SetSize(1); m_TempArray.SetAt(0,160); m_ComCtl.SetOutput(COleVariant(m_TempArray)); MessageBox("You send 164 sucessfully","MessageBox",MB_OK);}//接受代码在通信事件接受void CTestcomDlg::OnOnCommMscomm1() { // TODO: Add your control notification handler code here BYTE *byteData; short m_DataNum; CString m_DataStr; int i; m_DataNum=m_ComCtl.GetInBufferCount(); m_RecVar=m_ComCtl.GetInput(); byteData=m_RecVar.pbVal;//VT_BYREF; } 谢谢mousefj(冯杰),其实我刚才已经说了,用你的方法可以行得通,发送和接收都没有问题,就是在程序运行之前还会跳出来一个对话框,说“Invalid property value”,提示我采用了非标准的通讯速率,然后点击这个对话框以后就可以正常运行程序了。我的问题是,如何避免这个对话框的跳出? try{ m_ComCtl.SetCommPort(1); if(!m_ComCtl.GetPortOpen()) m_ComCtl.SetPortOpen(TRUE); m_ComCtl.SetSettings("9600,n,8,1");}catch(CException *e){}m_ComCtl.SetInputMode(0);m_ComCtl.SetInBufferCount(0);m_ComCtl.SetRThreshold(9);Sleep(1000); MessageBox("You initial COM port sucessfully","MessageBox",MB_OK); 根本上解决问题我还未找到原因,只好用捕捉错误但不处理这种笨办法了。m_ComCtl.SetSettings("9600,n,8,1");改为m_ComCtl.SetSettings("1000000,n,8,1"); 我这个程序刚运行没错 点击4次后就会出现socket创建失败 有谁知道怎么了阿 MDI中的resize问题 请问到底如何使一个子控件重绘? 奇怪的attach 的不明白用法:请指教一下。 如何捕捉其他应用程序的对话框以及其中的按钮? 不知debug和release模式各有什么用? toolbar如何得到其中按钮的相应idButton号 向另一个实例发消息? 为什么一定要用COM?? 为什么在我的线程中接不到我的自定义消息????帮帮忙吧 请教一个设备描述表的问题 请教一个关于字符串保转换的问题
直接将波特率设置为100000
设置过程:
设用MSComm控件:
CIIBMSComm m_comm;
if(m_comm.GetPortOpen())//关闭端口
m_comm.SetPortOpen(FALSE);
m_comm.SetCommPort(PortNo);//设置端口号
if(parity)
m_TempPortSetting=BaudRadio+",n,"+databit+",1";//设置端口传输方式
else
m_TempPortSetting=BaudRadio+",n,"+databit+",1";
m_comm.SetSettings(m_TempPortSetting);
m_comm.SetInputMode(comInputModeBinary);//以二进制形式接受数据
m_comm.SetPortOpen(TRUE);//打开端口
m_comm.SetRThreshold(1);//设置响应端口接收事件的条件
m_comm.SetInputLen(0);//清楚输入缓冲区
m_comm.GetInput();
HANDLE m_hCom=CreateFile( m_pPortParam->cCom ,GENERIC_READ|GENERIC_WRITE,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DCB dcb;
dcb.DCBlength=sizeof(DCB);
GetCommState(m_hCom,&dcb)dcb.BaudRate=100000 ; //现实中可没有设备支持这么高的速度噢^_^
SetCommState(m_hCom,&dcb);关于这些函数的具体用法,需要去查一下MSDN啦。
BaudRadio="1000000";
初始化代码void CTestcomDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_ComCtl.SetCommPort(1);
if(!m_ComCtl.GetPortOpen())
m_ComCtl.SetPortOpen(TRUE);
m_ComCtl.SetSettings("9600,n,8,1");
m_ComCtl.SetInputMode(0);
m_ComCtl.SetInBufferCount(0);
m_ComCtl.SetRThreshold(9);
Sleep(1000);
MessageBox("You initial COM port sucessfully","MessageBox",MB_OK);}
请实施看能否通过。我这是运行正常的。
m_ComCtl.SetSettings("100000,n,8,1");再试试。
void CTestcomDlg::OnButton2()
{
// TODO: Add your control notification handler code here
/*tempstr.Insert(0,164);
m_ComCtl.SetOutput(COleVariant(tempstr));*/
CByteArray m_TempArray;
m_TempArray.SetSize(1);
m_TempArray.SetAt(0,160);
m_ComCtl.SetOutput(COleVariant(m_TempArray));
MessageBox("You send 164 sucessfully","MessageBox",MB_OK);
}
//接受代码在通信事件接受
void CTestcomDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
BYTE *byteData;
short m_DataNum;
CString m_DataStr;
int i;
m_DataNum=m_ComCtl.GetInBufferCount();
m_RecVar=m_ComCtl.GetInput();
byteData=m_RecVar.pbVal;//VT_BYREF;
}
我的问题是,如何避免这个对话框的跳出?
m_ComCtl.SetCommPort(1);
if(!m_ComCtl.GetPortOpen())
m_ComCtl.SetPortOpen(TRUE);
m_ComCtl.SetSettings("9600,n,8,1");
}
catch(CException *e)
{
}
m_ComCtl.SetInputMode(0);
m_ComCtl.SetInBufferCount(0);
m_ComCtl.SetRThreshold(9);
Sleep(1000);
MessageBox("You initial COM port sucessfully","MessageBox",MB_OK);
m_ComCtl.SetSettings("9600,n,8,1");
改为
m_ComCtl.SetSettings("1000000,n,8,1");