在VS2013下编写基于MSCOMM的MFC串口通讯程序
VS2013,串口程序编写和调试;参照网文,整理。
开发环境:VS2013
串口控件
电脑:win7,32版本
准备:
· 1、下载串口控件:
链接:http://pan.baidu.com/s/1geD2AUf 密码:yfxo
压缩包包含四个文件:MSCOMM.SRG、MSCOMM32.DEP、MSCOMM32.oca、mscomm32.ocx;
解压后拷贝到:
C:\Windows\System32(WIN7、Win8、Win10系统);
C:\WINDOWS\system32(XP系统)。
注意:64位win7、8、10系统还需要将mscomm32.ocx文件复制到C:\Windows\SysWOW64\目录下,否则后面注册会出错。
2、在C:\Windows\System32里找到cmd.exe以管理员身份运行:
Regsvr32 C:\WINDOWS\system32\MSCOMM32.OCX
注册成功如图所示:
3、修改注册表:win+R组合键打开“运行”或者直接在开始菜单里找到“运行”;输入regedit后回车,打开注册表管理器,在其中找到HKEY_CLASSES_ROOT项下的Licenses项,添加主项命名为“4250E830-6AC2-11cf-8ADB-00AA00C00905”,并将键值修改为“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”
4、新建MFC工程:在VS 2013中新建一个MFC项目,比如基于对话框的一个项目
5、添加MSComm控件:在对话框上右击选择“打开ActiveX控件”,英文版“InsertActiveX Control”找到Microsoft Communications Control,version 6.0,此时在对话框中出现一个电话一下的按钮,这个就是MSComm控件,软件运行时是看不见的
6、按你需要的,添加对话框控件:
7、在电话控件上添加映射变量;完成后, 在工程中会自动生成mscomm.h 和mscomm.cpp两个文件;
8、在串口控件上右键,添加控件事件处理函数:
11、打开串口按钮回调函数编写:
CString portnums = _T("0");//定义串口编号,默认值串口编号为0
void Cport_demonstrationDlg::OnBnClickedBottonOpen()
{
// TODO: 在此添加控件通知处理程序代码
Edit.GetWindowText(portnums);//获取编辑框中的串口编号
int flag = _ttoi(portnums);//将其转化为数值类型
if (flag)//如果输入的串口编号为正整数,才执行下列命令
{
if (m_mscomm.get_PortOpen())
{
m_mscomm.put_PortOpen(FALSE);
}
m_mscomm.put_CommPort(flag); //选择COM
m_mscomm.put_InBufferSize(1024); //接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);//以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm
m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,1个停止位
if (!m_mscomm.get_PortOpen())//如果串口没有打开则打开
{
m_mscomm.put_PortOpen(TRUE);//打开串口
AfxMessageBox(_T("串口打开成功"));
}
else
{
m_mscomm.put_OutBufferCount(0);
AfxMessageBox(_T("串口打开失败"));
}
}
else
{
AfxMessageBox(_T("请先输入需要打开串口编号"));
}
}
12、关闭按钮回调函数编写:
void Cport_demonstrationDlg::OnBnClickedBottonClose()
{
// TODO: 在此添加控件通知处理程序代码
m_mscomm.put_PortOpen(FALSE);//关闭串口
AfxMessageBox(_T("串口已关闭"));
}
13、发送数据按钮回调函数实现:
void Cport_demonstrationDlg::OnBnClickedBottonSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true); //读取编辑框内容
m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据
m_EditSend.Empty(); //发送后清空输入框
UpdateData(false); //更新编辑框内容
}
14、接收数据按钮回调函数编写(写在串口事件处理程序里面):
void Cport_demonstrationDlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
static unsigned int cnt = 0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len, k;
unsigned int data[1024] = { 0 };
byte rxdata[1024]; //设置 BYTE 数组
CString strtemp;
if (m_mscomm.get_CommEvent() == 2) //值为 2 表示接收缓冲区内有字符
{
cnt++;
variant_inp = m_mscomm.get_Input(); //读缓冲区消息
safearray_inp = variant_inp; ///变量转换
len = safearray_inp.GetOneDimSize(); //得到有效的数据长度
for (k = 0; k<len; k++)
{
safearray_inp.GetElement(&k, rxdata + k);
}
for (k = 0; k<len; k++) //将数组转换为 CString 型变量
{
strtemp.Format(_T("%c"), *(rxdata + k));
m_EditReceive += strtemp;
CString temp = _T("\r\n"); //换行
m_EditReceive += temp;
}
}
UpdateData(FALSE); //更新编辑框内容
}
VB串口通信
描述
上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。简言之如此,实际情况千差万别,但万变不离其宗:上下位机都需要编程,都有专门的开发系统。
上位机工作原理
两机如何通讯,一般取决于下位机,TCP/IP一般是支持的,但是下位机一般具有更可靠的独有通讯协议,购买下位机时,会带一大堆手册光盘,告诉你如何使用特有协议通讯,里面会举大量例子,一般对编程人员而言一看也就那么回事,使用一些新的API(API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节罢了,多语言支持功能模块,一般同时支持数种高级语言为上位机编程。
通常上位机和下位机通讯可以采用不同的上位机示例图片通讯协议,可以有RS232的串口通讯或者采用RS485串行通讯。当用计算机和PLC通讯的时候,不但可以采用传统的D形式的串行通讯,还可以采用更适合工业控制的双线的PROFIBUS-DP通讯。采用封装好的程序开发工具就可以实现PLC和上位机的通讯,当然可以自己编写驱动类的接口协议控制上位机和下位机的通讯。
通常工控机,工作站,触摸屏作为上位机,通信控制PLC,单片机等作为下位机,从而控制相关设备元件和驱动装置。
上位机开发的软件
1、visual studio 2008
Microsoft Visual Studio 2008是面向Windows Vista、Office 2007、Web 2.0的下一代开发工具,代号“Orcas”,是对Visual Studio 2005的一次及时、全面的升级。
VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。使用Visual Studio 2008可以高效开发Windows应用程序。设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。同时Visual Studio 2008支持项目模板、调试器和部署程序。Visual Studio 2008可以高效开发Web应用,集成了AJAX 1.0,包含AJAX项目模板,它还可以高效开发Office应用和Mobile应用。
2、MFC
是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
3、Qt
Qt[1] 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具。
4、GTK
GTK+(GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。并且,GTK+也有Windows版本和Mac OS X版。
5、wxWidgets
wxWidgets是一个开源的跨平台的C++构架库(framework),它可以提供GUI(图形用户界面)和其它工具。目前的2.x版本支持所有版本的Windows、带GTK+或Motif的Unix和MacOS。一个支持OS/2的版本正在开发中。开源跨平台, 和 CodeBlocks (开源跨平台的IDE)配合的很好, 而且可以用 wxSmith 很方便的设计界面。 而且学过MFC上手 wxWidgets 很快。
上位机快速开发教程
(1)准备工作
一台装有VS2010的计算机,用于测试的虚拟串口软件。同时你必须具有VB基础知识,这个VB上位机开发是入门级的,仅将VB.NET通信基础方法稍作介绍。
(2)串口通信常识
在串口通信中,通过编写单片机程序知道,我们应对如下参数进行设置:波特率、数据位和停止位、奇偶校验位。如果自己编写上位机的时候,我们考虑的不能仅仅是这些了,下面介绍上位机开发过程中需要特别注意的知识点。
MSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。当串口发生事件或错误时,MSComm控件会产生OnComm事件,用户程序可以捕获该事件进行相应处理。
常用属性和方法
利用MSComm控件实现计算机通信的关键是理解并正确设置MSComm控件众多属性和方法。以下是MSComm控件的常用属性和方法:
●Commport:设置或返回串口号。其值从COM1到COM16。
●Settings:以字符串的形式设置或返回串口通信参数。
●Portopen:设置或返回串口状态。
●InputMode:设置或返回接收数据的类型。有文本和二进制两种类型。
●Inputlen:设置或返回一次从接收缓冲区中读取字节数。
●InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
●InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。
●Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。
●OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
●OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。
●Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
●Rthreshold:该属性为一阀值。当接收缓冲区中字符数达到该值时,MSComm控件设置Commevent属性为ComEvReceive,并产生OnComm事件。用户可在OnComm事件处理程序中进行相应处理。若Rthreshold属性设置为0,则不产生OnComm事件。例如用户希望接收缓冲区中达到一个字符就接收一个字符,可将Rthreshold设置为1。这样接收缓冲区中接收到一个字符,就产生一次OnComm事件。
●Sthreshold:该属性亦为一阀值。当发送缓冲区中字符数小于该值时,MSComm控件设置Commevent属性为ComEvSend,并产生OnComm事件。若Sthreshold属性设置为0,则不产生OnComm事件。要特别注意的是仅当发送缓冲区中字符数小于该值的瞬间才产生OnComm事件,其后就不再产生OnComm事件。例如Sthreshold设置为3,仅当发送缓冲区中字符数从3降为2时,MSComm控件设置Commevent属性为ComEvSend,同时产生OnComm事件,如发送缓冲区中字符始终为2,则不会再产生OnComm事件。这就避免了发送缓冲区中数据未发送完就反复发生OnComm事件。
●CommEvent:这是一个非常重要的属性。该属性设计时无效,运行时只读。一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm控件为CommEvent属性赋不同的代码,同时产生OnComm事件。用户程序就可在OnComm事件处理程序中针对不同的代码,进行相应的处理。
(3)开发步骤(仅供参考)
1. 运行VS2010,新建一个Visual Basic的Windows窗体应用程序项目。将窗体的StartPosition属性改为CenterScreen,运行程序时,窗体在屏幕中央显示。
2. 由于默认情况下,通信所需的“Microsoft Communications Control,version 6.0”组件不在工具箱里面,所以我们需要手动添加。单击左侧的工具箱,并在控件栏单击鼠标右键,在弹出的菜单中选中“选择项”,在弹出的对话框中单击“COM组件”并选中“MicrosoftCommunications Control,version 6.0”,单击确定即可完成添加。
此时移动鼠标到窗体上时,鼠标箭头就会变成电话的形状,在窗体任意位置单击放置该控件。
3. 单击工具箱,在窗体上添加5个Label,并在属性里将Text属性依次改为:串口号、波特率、校验、数据位、停止位。再向窗体上添加5个ComboBox,从上到下依次排列。 4. 向窗体添加一个OvalShape和一个Button。将OvalShape的size属性改为“24,24”,FillStyle改为Solid。
5. 向窗体添加一个CheckBox、一个按钮Button和一个TextBox,将CheckBox的Text属性改为“十六进制发送”将这个按钮的text属性改为“发送”。
6. 向窗体添加一个Label和一个TextBox。更改Label的Text属性为“接收区”。 7. 向窗体添加一个CheckBox,将其Text属性改为“十六进制显示”
下面将要对部分控件进行设置,这样可以减少代码的长度 将波特率一栏ComboBox的Item属性中添加如下内容:
将校验一栏ComboBox的Item属性中添加如下内容
将数据位一栏ComboBox的Item属性中添加如下内容
将波特率一栏ComboBox的Item属性中添加如下内容
四、源代码
Public Class Form1 Dim cpSetting As String
Dim com_last_num As Integer = 0 ‘定义一个全局变量,作用为记录上一个串口号 Sub GetSerialPortNames() ’搜索计算机中所有可用串口函数 On Error GoTo eRRHND ‘错误处理 ’搜索计算机中可用串口
For Each sp As String In My.Computer.Ports.SerialPortNames ComboBox1.Items.Add(sp) Next
ComboBox1.Sorted = True
ComboBox1.SelectedIndex = 0 ‘选择搜索到的第一个串口名称 Exit Sub
eRRHND: ’表示未搜到串口 MsgBox(“Oh, NO!”) End Sub
‘检测串口是否可用函数
Private Function Test_COM(ByVal com_num As Integer) As Boolean
If com_num 《》 com_last_num Or Button1.Text = “打开端口” Then ’如果选择的端口跟上次一样就不检测了
On Error GoTo Comm_Error
AxMSComm1.CommPort = com_num ‘将新串口号赋给ComPort
AxMSComm1.PortOpen = True ’打开串口
AxMSComm1.PortOpen = False ‘关闭串口
Test_COM = True ’串口可用则返回
Exit Function
Comm_Error: ‘根据错误号作出相应处理 If Err.Number = 8002 Then
MsgBox(“串口错误,请重新选择串口”, vbOKOnly, “错误提示!”) ElseIf Err.Number = 8005 Then MsgBox(“串口已打开!”) Else
MsgBox(“其它错误”) End If
Test_COM = False ’如果出错,则返回0 Exit Function Resume Next End If End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
‘载入窗体初始化
GetSerialPortNames() ’将搜到的串口在下拉菜单中显示出来
AxMSComm1.InBufferSize = 1024 ‘接收缓冲区大小,此项无法在串口打开时进行设置 AxMSComm1.OutBufferSize = 1024 ’发送缓冲区大小 ComboBox2.Text = “9600” ComboBox3.Text = “无校验” ComboBox4.Text = “8” ComboBox5.Text = “1” ChangePortProperty()
‘设置接收数据的格式为二进制
AxMSComm1.InputMode = MSCommLib.InputModeConstants.comInputModeBinary AxMSComm1.InputLen = 0 ’设置从缓冲区读取全部数据 AxMSComm1.RThreshold = 1 ‘设置接收串口OnCommon事件 AxMSComm1.PortOpen = True ’打开串口 If AxMSComm1.PortOpen = True Then
OvalShape1.FillColor = Color.Green ‘OvalShape颜色设为绿色 Button1.Text = “关闭端口” ’按钮上的文字显示为关闭端口 Else
OvalShape1.FillColor = Color.Red ‘OvalShape颜色设为红色 Button1.Text = “打开端口” ’按钮上的文字显示为打开端口 End If End Sub
‘打开关闭串口代码
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ptNum As Integer ’通过串口名称获取串口号
If Len(ComboBox1.SelectedItem) 》 4 Then
ptNum = Val(Microsoft.VisualBasic.Strings.Right(ComboBox1.Text, 2)) Else
ptNum = Val(Microsoft.VisualBasic.Strings.Right(ComboBox1.Text, 1)) End If
If AxMSComm1.PortOpen = False Then ‘如果串口是关闭的 If Test_COM(ptNum) = True Then ’如果选择的串口可用? ‘ ChangePortProperty()
AxMSComm1.PortOpen = True ’则打开该串口
Button1.Text = “关闭端口” ‘按钮上的文字显示为关闭端口 OvalShape1.FillColor = Color.Green ’OvalShape颜色设为绿色 End If Else
AxMSComm1.PortOpen = False ‘关闭该串口
OvalShape1.FillColor = Color.Red ’OvalShape颜色设为红色 Button1.Text = “打开端口” ‘按钮上的文字显示为打开端口 End If End Sub
’如下是访问网站的链接的代码,可以选择访问网站的浏览器,这里只使用默认的IE浏览器 Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked LinkLabel1.LinkVisited = True
System.Diagnostics.Process.Start(“www.baidu.com/p/huzhiqianglz”) End Sub
‘处理发送数据的代码
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim hexString() As Byte Dim source_Txt As String Dim i As Integer
source_Txt = TextBox1.Text ’将要发送的数据存放到变量source_Txt中
If CheckBox1.CheckState = CheckState.Checked Then ‘如果十六进制发送复选框被勾上 If Len(source_Txt) Mod 2 = 0 And Len(source_Txt) 《》 0 Then ’如果将要发送的数据长度不为或者能被2整除
ReDim hexString(Len(source_Txt) / 2 - 1) ‘重新定义hexString数组 For i = 0 To Len(source_Txt) - 1 Step 2
hexString(i / 2) = Val(“&H” & Mid(source_Txt, i + 1, 2)) ’将hexString转换成十六进制显示
Next
AxMSComm1.Output = hexString ‘将转换的数据发送到串口 Else ’否则提示格式不正确 MsgBox(“格式不正确!”) End If
Else ‘否则输出字符串
AxMSComm1.Output = TextBox1.Text
End If End Sub
Sub ChangePortProperty() Dim comSetting As String Dim parity As String = “” ‘关闭端口
If AxMSComm1.PortOpen = True Then AxMSComm1.PortOpen = False End If ’获取串口号
If Len(ComboBox1.SelectedItem) 》 4 Then
AxMSComm1.CommPort = Val(Microsoft.VisualBasic.Strings.Right(ComboBox1.Text, 2)) Else
AxMSComm1.CommPort = Val(Microsoft.VisualBasic.Strings.Right(ComboBox1.Text, 1)) End If ‘设置校验方式
If ComboBox3.Text = “无校验” Then parity = “N”
ElseIf ComboBox3.Text = “奇校验” Then parity = “O”
ElseIf ComboBox3.Text = “偶校验” Then parity = “E” End If
comSetting = ComboBox2.Text & “,” & parity & “,” & ComboBox4.Text & “,” & ComboBox5.Text
’串口设置格式:9600,N,8,1 AxMSComm1.Settings = comSetting End Sub
‘将十进制转换为16进制
Private Function Decimal2Hex(ByRef c As String) As String Decimal2Hex = Hex(CInt(c)) If Len(Decimal2Hex) 《 2 Then
Decimal2Hex = “0” & Decimal2Hex End If End Function
’串口号发生改变的处理程序
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged ChangePortProperty()
End Sub
Private ReadStr As String = “”
Private Sub AxMSComm1_OnComm(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles AxMSComm1.OnComm
Dim i As Object
Dim bytData As Object ‘用来从接收缓冲区读取数据
Select Case AxMSComm1.CommEvent ’
对接收事件进行处理
Case MSCommLib.OnCommConstants.comEvReceive
bytData = AxMSComm1.Input ‘将接收到的数据暂存 For i = 0 To UBound(bytData)
If CheckBox2.CheckState = CheckState.Checked Then
ReadStr = ReadStr & Decimal2Hex(CStr(bytData(i)))
Else
ReadStr = ReadStr & CStr(bytData(i))
End If
Next
TextBox2.Text = ReadStr ’将转换后的数据在接收区显示
End Select
End Sub
End Class
五、程序中用到的几个函数解释
Microsoft.VisualBasic.Strings.Right(String,Num):将字符串从右边开始截取字符串String中Num个字符。例如当String的值为“Welcome”,Num值为3,则该函数返回的值为字符串“ome”。另外通过将COM1拆分即可得到1,这是上例中得到得到串口号的方法。
Val(String):将字符串类型转换为数值型。例如String为字符串“123”,则返回值为数值型123。 Hex(Integer):将整型数转换为16进制数。如:Integer为13,则返回十六进制的D
其实有些函数看不懂也没关系,可能我介绍的不是很详细,有些资料上网查一下也很方便的,这里就不再多罗嗦了。
相关问答
求教如何在mfc上实现实时监控串口数据用图标指示状态?
有个max232芯片转电平就行了,有卖那种里面有232芯片的线,一头接单片机串口,一头接电脑串口,没有串口有那种串口转usb的口。程序么,就是设置下波特率,想...
如何从零开始学习编程?
从零开始学编程,首先需要确定几个问题:第一你的年龄,第二你所学的专业,第三你的数学和英语基础怎么样?还有你将来想要的发展方向:比如做网站、还是做软件...从...
visualstudio能否开发一个具有人机交互界面的软件,并且能够与其它设备进行RS485通讯?
如果用C++来设计的话,可用MFC制作界面,至于RS485,和RS232一样都是串口通信,在Windows上可以用文件读写的方式,使用CreateFile与串口相连,然后用SetCommStat...
有什么开源免费库做桌面界面的吗,在用MFC,麻烦,我做工业软件二次开发的?
MFC,应该是Windows平台一个比较老的C++框架了,开发桌面界面的确有些费力,这里介绍3个简单易学的C++开源、免费桌面框架或库,分别是Qt,wxWidgets和Duilib,感...你...
初学QT怎么学?
Qt是一个跨平台的C++图形用户界面程序开发框架,其设计之初就是为了方便开发人员快速、高效的设计出一个美观、简洁的GUI程序,自带了大量可视化控件,只需拖拽,...
vs2010怎么传输数据?
在VS2010中,数据传输可以通过多种方式实现。其中一种常见的方法是使用串口通信,这通常涉及到基于Win32API和MFC的开发。另一种方法是利用VB语言编写程序进行...
如何使用visualstudio进行Windows桌面开发?
VS开发桌面程序可以用基于c++的MFC,也可以用C#,后者对于开发桌面程序更流行一些,毕竟控件多,用起来更省力。由于本人常用c++开发后台程序,偶尔也会用MFC做...1)...
关于wince模拟器的软键盘和实际键盘的消息连接。
1.怎样在一个控件获得焦点时打开软键盘?比如一个EditBox获得焦点后,这个时候自动打开软键盘,这样可以方便用户输入——SIPINFO、SHSIPINFO、SIPSETI...
关于wince模拟器的软键盘和实际键盘的消息连接。
1.怎样在一个控件获得焦点时打开软键盘?比如一个EditBox获得焦点后,这个时候自动打开软键盘,这样可以方便用户输入——SIPINFO、SHSIPINFO、SIPSETI...
学习单片机需要什么知识基础?
朋友们好,我是电子及工控技术,我来回答这个问题。单片机作为一种实践性非常强的技术,要想入门单片机就要有做一些准备,有一句话叫“兵马未动,粮草先行”,我...1,...