当前位置:首页 » 编程软件 » 深入浅出vc串口编程

深入浅出vc串口编程

发布时间: 2022-02-16 06:43:41

① 关于VC++串口编程接收数据的问题

你不建工程直接编译,vc会帮你建立一个工程的。所以在编译第二个程序的时候,先选择“file
|
close
workspace”把前一个程序的工作区关掉,这样就不会有影响了。

② vc++串口编程

我这里有例子
怎么给你呢
给你一个简单的初始化串口的代码:
HANDLE
hCom=CreateFile("COM2",
GENERIC_READ|GENERIC_WRITE,0,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return
FALSE;
}
SetupComm(hCom,1024,1024);
COMMTIMEOUTS
TimeOuts;
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts);
//设置超时
DCB
dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600;
//波特率为9600
dcb.ByteSize=8;
//每个字节有8位
dcb.Parity=NOPARITY;
//无奇偶校验位
dcb.StopBits=1;
//1个停止位
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
////////////////////////////////////////////////
CKeyBoardDlg::EnableWindow(false);

③ VC++串口编程问题

在MSDN中帮你查了一下,好像需要一个LicenseKey。
另外,在C++中我们一般用::CreateFile API 函数打开串口,自己读,如果需要我可以给你我读取串口的方法。
/*
Copyright (c) 1994
*/
WCHAR pwchLicenseKey[] =
{
0x0043, 0x006F, 0x0070, 0x0079, 0x0072, 0x0069,
0x0067, 0x0068, 0x0074, 0x0020, 0x0028, 0x0063,
0x0029, 0x0020, 0x0031, 0x0039, 0x0039, 0x0034,
0x0020
};
// Create the license string
BSTR bStrLicense = ::SysAllocStringLen(pwchLicenseKey,
sizeof(pwchLicenseKey)/sizeof(WCHAR));

// Create the CMSComm object with run-time license data
CMSComm * pComm = new CMSComm;
pComm->Create(NULL, WS_VISIBLE, CRect(0,0,0,0),
this, 999, NULL, FALSE, bStrLicense);

④ 如何用VC进行串口编程

1、新建MFC对话框工程如下

双击两个Button按钮;

代码中显示如下:

[cpp] view plain print?

  • voidCMSCommTestDlg::OnBnClickedBtnopen()

  • {

  • //TODO:

  • }

  • voidCMSCommTestDlg::OnBnClickedBtnsend()

  • {

  • //TODO:

  • }

  • voidCMSCommTestDlg::OnOncommMscomm1()

  • {

  • //TODO:Addyourmessagehandlercodehere

  • }

  • void CMSCommTestDlg::OnBnClickedBtnopen()

  • {

  • // TODO: Add your control notification handler code here

  • }

  • void CMSCommTestDlg::OnBnClickedBtnsend()

  • {

  • // TODO: Add your control notification handler code here

  • }

  • void CMSCommTestDlg::OnOncommMscomm1()

  • {

  • // TODO: Add your message handler code here

  • }


  • 5、将上面代码补全如下:

    [cpp] view plain print?

  • voidCMSCommTestDlg::OnClickedBtnopen()

  • {

  • //TODO:

  • //如果端口已经开启,那么先关闭

  • if(m_comm1.get_PortOpen())

  • {

  • m_comm1.put_PortOpen(FALSE);

  • }

  • m_comm1.put_CommPort(3);//选择com3,可以根据具体情况更改

  • m_comm1.put_InBufferSize(1024);//设置输入缓冲区的大小,Bytes

  • m_comm1.put_OutBufferSize(1024);//设置输出缓冲区的大小,Bytes

  • m_comm1.put_Settings(_T("9600,n,8,1"));//波特率9600,无校验,8个数据位,停止位1

  • m_comm1.put_InputMode(1);//1:表示以二进制方式检索数据

  • m_comm1.put_RThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

  • m_comm1.put_InputLen(0);//设置当前接收区长度是0

  • if(!m_comm1.get_PortOpen())

  • {

  • m_comm1.put_PortOpen(TRUE);

  • }

  • else

  • {

  • AfxMessageBox(_T("Cannotopenserialport!"));

  • }

  • m_comm1.get_Input();//先预读缓冲区以清除残留数据

  • UpdateData(FALSE);

  • }

  • voidCMSCommTestDlg::OnClickedBtnsend()

  • {

  • //TODO:

  • UpdateData(TRUE);

  • m_comm1.put_Output(COleVariant(m_sTXDATA));//发送数据

  • }

  • voidCMSCommTestDlg::OnOncommMscomm1()

  • {

  • //TODO:Addyourmessagehandlercodehere

  • VARIANTvariant_inp;

  • COleSafeArraysafearray_inp;

  • LONGlen,k;

  • BYTErxdata[2048];

  • CStringstrtemp;

  • if(m_comm1.get_CommEvent()==2)//事件值为2表示缓冲区内有字符

  • {

  • variant_inp=m_comm1.get_Input();//读缓冲区

  • safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量

  • len=safearray_inp.GetDim();//得到有效数据长度

  • for(k=0;k<len;k++)

  • {

  • safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组

  • }

  • for(k=0;k<len;k++)//将数组转换为CString型变量

  • {

  • BYTEbt=*(char*)(rxdata+k);//字符型

  • strtemp.Format(_T("%c"),bt);//将字符送入临时变量strtemp存放

  • m_sRXDATA+=strtemp;//接收到的数据放到编辑框对应的变量中

  • }

  • }

  • SetDlgItemText(IDC_EDIT_RXDATA,m_sRXDATA);

  • }

⑤ 推荐一本关于VC串口通信,以及上位机编程的书,最好有视频教程

一致推荐

Visual C++_Turbo C串口通信编程实践

⑥ 用VC++编写一个串口通信程序,借助串口调试助手来完成收发。程序中的串口号和串口助手中串口号必须一致吗

你用VC++编写的程序实际上与串口助手的功能类似,如果串口号设置一致会导致冲突。
例如你先开了自己的程序,打开串口com3,然后再开串口助手设置相同的串口号通常会被提示“串口已打开”或者类似被占用什么的……记不清了。
如果非要用串口助手调试,请确保你的计算机有两个串口接口,分别把自己的程序和串口助手设置为不同串口号,再在硬件上将这两个串口的输出与输入、输入与输出联通,那么就可以调试了。
麻烦一点的可以用两台电脑进行调试。

⑦ 用VC++编程串口的话 程序写出来应该放在什么工具里运行的

没有明白你的意思!

你编程序是用来干什么呢?

⑧ 一个VC++程序同时持续读取两个串口的数据,给个思路吧,谢谢!

多线程实现串口,可以用api实现,
深入浅出Win32多线程程序设计之综合实例,
http://tech.163.com/05/1223/10/25LABDP00009159F_4.html
这篇不错的,可以给思路

⑨ 关于串口调试助手VC源程序及详细编程过程

这样你每接受一个字符,如:strtemp.Format("%X",bt); 就把这个字符串的没一位转换成十进制,然后,把第一个十进制左移4位,然后加上后一个十进制数字,得出的结果也就是你要的数字,这个方法我测试过,一定行的
注意:你这个for(k=0;k<len;k++) 循环,每循环一次就接收一个字符,你只要每接收一个字符后,按我上面的方法转换,得到的值就一顶是你相应16进制转换成10进制的值,哈哈哈哈

⑩ visual c++ 串口编程 初学,求救

给你点代码
void Com::init_com_interface()
{
hcom = CreateFile("COM1", // communication port string (COMX)
GENERIC_READ | GENERIC_WRITE, // read/write types
0, // comm devices must be opened with exclusive access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // Async I/O
NULL); // template must be 0 for comm devices

DCB dcb;
COMMTIMEOUTS tout;
GetCommState(hcom,&dcb);
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(hcom,&dcb);

tout.ReadTotalTimeoutConstant = 0;
tout.WriteTotalTimeoutConstant = 0;
tout.WriteTotalTimeoutMultiplier = 0;
tout.ReadTotalTimeoutMultiplier = 0;
tout.ReadIntervalTimeout = -1;

SetCommTimeouts(hcom,&tout);

//DWORD len;
//if (!ReadFile(hcom,rxbuf,200,&len,NULL))
//{
// return FALSE;
//}
//else return TRUE;

}
以上是串口初始化代码
以下是发送字符串代码
void Com::SendCommand(CString str)
{
CString m_vHexshow="";

//mm[1]=100;
// m_vStaticFasong=str;
// m_vEditJieshou="";
// UpdateData(FALSE);

str.MakeLower();
int m=0,n=0,mn=0;
for(int i=0;i<str.GetLength();i+=3)
{
m=(str[i]<58)?(str[i]-48):(str[i]-87);
n=(str[i+1]<58)?(str[i+1]-48):(str[i+1]-87);
mn=m*16+n;
//if(mn==239)
//
m_vHexshow+= char(mn);
}

//
//if (m_vHexshow[0]==-17)

memcpy(txbuf,m_vHexshow,m_vHexshow.GetLength());
//if (txbuf[0]==239)

DWORD len;
if (!WriteFile(hcom,txbuf,m_vHexshow.GetLength(),&len,NULL))
{
}
}

热点内容
eclipse运行python 发布:2025-01-14 04:07:06 浏览:292
struts源码学习 发布:2025-01-14 04:02:28 浏览:685
李根数据库 发布:2025-01-14 03:44:52 浏览:341
php数据库删除 发布:2025-01-14 03:35:51 浏览:293
上传进度条代码 发布:2025-01-14 03:32:01 浏览:638
电脑怎样创建文件夹 发布:2025-01-14 03:31:20 浏览:658
王朝脚本 发布:2025-01-14 03:26:08 浏览:175
dcloud源码 发布:2025-01-14 03:26:00 浏览:301
梅林IPTV脚本 发布:2025-01-14 03:23:46 浏览:633
c语言if语句执行顺序 发布:2025-01-14 03:22:19 浏览:990