精华内容
下载资源
问答
  • Delphi串口通信编程

    2010-07-05 15:46:00
    Delphi串口通信编程,这个只是一个PPT,讲解的不怎么详细,只供初学者了解!
  • c#串口编程

    2018-06-28 14:33:54
    c#串口编程实战示例演示,怎么高效通过代码进行串口通信
  • VB串口设置编程介绍

    2010-01-22 10:41:40
    介绍串口功能怎么设置怎么使用以及怎么编程
  • 串口编程教程

    2013-02-20 13:38:25
    串口232接口介绍,编程注意事项,教您怎么实现串口编程
  • 串口通信编程实践(第2版),讲怎么用VC开发串口界面的,非常全面。 串口通信编程实践(第2版),讲怎么用VC开发串口界面的,非常全面。
  • 串口编程

    2010-11-02 11:09:15
    C#串口编程1.虚拟串口软件 由于手上没有串口硬件,所以在网上找了一个 VSPM 虚拟串口软件 ,据说是免费的。 下载地址:http://www.skycn.com/soft/30517.html 刚开始也不知道怎么用,摸索了一下,终于成功。 ...

    C#串口编程1.虚拟串口软件

    由于手上没有串口硬件,所以在网上找了一个 VSPM 虚拟串口软件 ,据说是免费的。

    下载地址:http://www.skycn.com/soft/30517.html

    刚开始也不知道怎么用,摸索了一下,终于成功。

    安装以后工作模式选择应该为:VSPM运行在Server模式,支持Client模式设备

    然后是使用设备探测器简历虚拟串口。(如果选择 建立默认的串口,软件就会自动帮你建立四个虚拟串口的)之后就是新增虚拟串口

    串口选COM2,选择监听的IP地址:本机IP,Client模式的设备尝试连接此端口:8099

    建立之后:选择此串口,再选择菜单栏:检查此设备连接,输入刚才新增时候选择的IP地址:本机IP,刚才选择的端口:8099

    点击重新连接,这个窗口没有什么反映:但是主窗口的串口最右边一栏:最后一次操作:显示客户端已经建立TCP/IP连接

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using Microsoft.VisualBasic;
    
    namespace WindowsApplication4
    {
        public partial class Form2 : Form
        {
            private SerialPort com = null;
            public Form2()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Byte[] bytes=MyEncode(textBox1.Text.Trim());
                com.Write(bytes, 0, bytes.Length);           
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                Microsoft.VisualBasic.Devices.Computer pc = new Microsoft.VisualBasic.Devices.Computer();
                foreach (string s in pc.Ports.SerialPortNames)
                { this.comboBox1.Items.Add(s); }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
    
                Byte[] bytes = new Byte[com.ReadBufferSize];
                com.Read(bytes, 0, bytes.Length);
                listBox1.Items.Add(MyDecode(bytes));
                listBox1.SelectedIndex = listBox1.Items.Count - 1;
                MessageBox.Show(MyDecode(bytes));
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                if (com == null)
                {
                    com = new SerialPort(comboBox1.Text);
                }
                if (!com.IsOpen)
                {
    
                    com.Open();
                    button3.Enabled = false;
                    button4.Enabled = true;
                }
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                if (com != null && com.IsOpen)
                {
                    com.Close();
                    button3.Enabled = true;
                    button4.Enabled = false;
                }
            }
    
            /// <summary>
            /// 编码   
            /// </summary>
            private Byte[] MyEncode(string text)
            {
                Encoder ed = Encoding.Default.GetEncoder();
                char[] chars = text.ToCharArray();
                Byte[] bytes = new Byte[ed.GetByteCount(chars, 0, chars.Length, true)];
                ed.GetBytes(chars, 0, chars.Length, bytes, 0, true);
                //return Convert.ToBase64String(bytes);
                return bytes;
            }
    
            /// <summary>
            /// 解码
            /// </summary>
            /// <param name="bytes"></param>
            /// <returns></returns>
            private string MyDecode(Byte[] bytes)
            {
                Decoder dd = Encoding.Default.GetDecoder();
                char[] chars = new char[dd.GetCharCount(bytes, 0, bytes.Length, true)];
                dd.GetChars(bytes, 0, bytes.Length, chars, 0, true);
                StringBuilder result = new StringBuilder(1000);
                foreach (char c in chars)
                {
                    result.Append(c);
                }
                return result.ToString();
            }
    
            private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                button4.PerformClick();
            }
    
        }
    }

     

     串口向设备发送信息




     

    串口接收设备发送的信息




     
     
     

     

    展开全文
  • STC系列芯片的串口通信编程 本人使用的是基于STC15F2K60S2芯片的开发板。 开发板上有关串口通讯的有:TMOD(定时器寄存器)、CSON(串口通信寄存器)、PCON(开发板电源控制寄存器)以及与51系列单片机区别最大的...

    STC系列芯片的串口通信编程

    本人使用的是基于STC15F2K60S2芯片的开发板。

    开发板上有关串口通讯的有:TMOD(定时器寄存器)、CSON(串口通信寄存器)、PCON(开发板电源控制寄存器)以及与51系列单片机区别最大的AUXR(分频寄存器)四种,其中以SCON最重要,其他的只是稍微设置下即可,串口通信初始化乍看很难,但沉下心来仔细研究,相信什么都难不倒我们。

    1、TMOD(定时器寄存器)
    有单片机基础的想必都知道应该怎么设置,这里我设置的是定时器1,自动重载模式

    	TMOD=0x20;  //定时器1工作方式2(自动重载)
    	TH1=0XFD;
    	TL1=0XFD;  //设置初始值,该初值在晶振频率为11.0592Hz的前提下波特率为9600
        //PCON=0X80;   //波特率加倍,加倍为9600    可选用
    

    波特率的计算比较繁琐,我们这里直接使用了最常用的波特率设置

    2、SCON(串口通信寄存器)
    串口通信最重要的寄存器,可位寻址
    CSON
    关于SM0,SM1:我们在这里只需要了解SM0,SM1是设置串口的工作模式的,这个大部分情况我们选择模式2,即SM0=0,SM1=1;

    关于REN:串口是否允许中断,这里我们选择允许,即REN=1;

    关于TI,RI,主要是在程序内部使用,作为串口读写数据完毕的标志,串口读写完毕后会由硬件将他们置1,编程中需我们手动清零
    在这里插入图片描述
    在这里插入图片描述

    	SM0=0;
    	SM1=1;    //串口通信选择方式2
    	REN=1;   //开启串口通信
    	//SCON=0x50;     两者等价
    

    3、PCON(开发板电源控制寄存器)
    PCON第7位控制波特率是否倍频,即PCON=0x80,波特率加倍,PCON=0x00或者不设置,波特率不加倍

    4、AUXR(分频寄存器)
    最后一个,也是STC芯片和51芯片在串口通信上不同的地方
    在这里插入图片描述常用的就最后两位,选择定时器0或者定时器1是否12分频
    我们这里选择定时器1为1T,所以设置AUXR=0x40;
    Ps:一定注意,STC系列的芯片一定要设置AUXR,AUXR=0x40;也好,AUXR=0x00;也好,一定要设置!!!不然串口通信无法实现,本人亲测

    最后,贴出我的代码,希望对需要的人有所帮助

    /*************************************************************************
    *测试程序:
    *程序功能:上位机每发送一个字节开发板的全部led灯都切换一次状态
    *开发板led初始状态为熄灭
    
    *标签:串口读取程序 循环查询
    *************************************************************************/
    
    #include "STC15F2K60S2.H"
    
    #define Y4 P2=((P2&0x1f)|0x80)
    #define Y5 P2=((P2&0x1f)|0xa0)
    #define Y6 P2=((P2&0x1f)|0xc0)
    #define Y7 P2=((P2&0x1f)|0xe0)
    
    void uart_init()
    {
    //	SM0=0;
    //	SM1=1;    //串口通信选择方式2
    //	REN=1;   //开启串口通信
    	SCON=0X50;
    	
    	TMOD=0x20;  //定时器1工作方式2(自动重载)
    	TH1=0XFD;
    	TL1=0XFD;  //设置初始值,该初值在晶振频率为11.0592Hz的前提下波特率为9600
    	
    	TR1=1;  //开启定时器1
    	EA=1;  //CPU允许中断
      ES=1; //允许串口中断
      PCON=0X80;   //波特率加倍,为9600
    	AUXR = 0x00;
    }
    
    
    
    int i=1;
    
    void main()
    {
    	Y4;P0=0xff;
    	Y5;P0=0x00;
    	uart_init();
    	while(1)
    	{
    		while(!RI);  //当接收到 字节接收完成 的标志时
    		if(i%2==1){Y4;P0=0x00;}
    		else {Y4;P0=0xff;}
    		i++;
    		RI=0;   //软件复位
    	}
    }
    
    ``
    
    
    展开全文
  • 单片机编程时,如果代码量不多,可以将所有的函数和定义等放在一个main.c文件中,但是随着代码量的增加,如果将所有代码都放在同一个.C文件中,会使得程序结构混乱、可读性与可移植性变差,而模块化编程就是解决这个...
  • 用API打开关闭串口编程方法

    千次阅读 2015-07-16 09:07:30
    VC串口编程方法分为利用VC串口控件(或VC串口类)和直接调用Windows底层API函数(我称之为VC API 串口编程)两种方法,不管哪种方法,其实质都是利用底层API函数对串口进行操作,这里我们来看怎么利用API函数来用 VC...

    在对串口进行操作之前都需要先打开串口,VC串口编程方法分为利用VC串口控件(或VC串口类)和直接调用Windows底层API函数(我称之为VC API 串口编程)两种方法,不管哪种方法,其实质都是利用底层API函数对串口进行操作,这里我们来看怎么利用API函数来用 VC 打开串口。

    在Windows 32位以上操作系统(Win98以上)中,将串口(包括其它通信设备)作为文件来处理,所以串口的打开、读写和关闭所用API函数与文件操作函数一样。所以打开串口用CreateFile,读串口用ReadFile,写串口用WriteFile,关闭串口用CloseHandle。

    一、用VC 打开串口、关闭串口的API函数

    1、打开串口用CreateFile,其声明如下:

    <span style="font-family:Microsoft YaHei;font-size:18px;">HANDLE CreateFile(
    	LPCTSTR lpFileName,<span style="white-space:pre">				</span>// file name
    	DWORD dwDesiredAccess,<span style="white-space:pre">				</span>// access mode
    	DWORD dwShareMode,<span style="white-space:pre">				</span>// share mode
    	LPSECURITY_ATTRIBUTES lpSecurityAttributes,<span style="white-space:pre">	</span>// SD
    	DWORD dwCreationDisposition,<span style="white-space:pre">			</span>// how to create
    	DWORD dwFlagsAndAttributes,<span style="white-space:pre">			</span>// file attributes
    	HANDLE hTemplateFile<span style="white-space:pre">				</span>// handle to template file
    	);</span>
    部分参数解释如下:

    ● lpFileName:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2,若要知道您的电脑有哪此串口,可以打开设备管理器查看,如下图所示,或用丁丁串口调试助手,这个工具启动后会枚举系统当前存在的串口。如果打开COM10以上的串口,lpFileName直接填串口名是打不开的,这时要改成:\\.\COM10 才行。

    ● dwDesiredAccess:访问类型,有读(dwDesiredAccess=GENERIC_READ)、写(dwDesiredAccess=GENERIC_WRITE)或两者兼有((dwDesiredAccess=GENERIC_READ | GENERIC_WRITE)。

    ● dwShareMode:指定端口的共享属性,该参数是为那些由许多应用程序共享的文件提供的,对于串口来说是不能共享的,所以它必须设置为0,这就是通信设备与文件之间的主要差别,如果当前的应用程序调用CreateFile打开一个串口,另外一个程序如果已经打开了该串口,此时CreateFile会返回一个错误代码。然而,同一个应用程序的多个线程可以共享由CreateFile返回的端口句柄,并且根据安全性属性设置,该句柄可以被打开端口的应用程序的子程序所继承。

    ● lpSecurityAttributes:安全属性,此参数为一LPSECURITY_ATTRIBUTES结构,此结构定义了一些属性,如果将该参数设为NULL,该端口将被分配为缺省安全属性,缺省安全属性下端口句柄是不能被继承的。

    安全属性LPSECURITY_ATTRIBUTES的结构声明如下:

    <span style="font-family:Microsoft YaHei;font-size:18px;">typedef struct _SECURITY_ATTRIBUTES{
    	DWORD  nLength;
    	LPVOID lpSecurityDescriptor;
    	BOOL   bInheritHandle;
    }SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;</span>
    结构成员nLength指明该结构的长度, lpSecurityDescriptor指向一个安全描述符,bInheritHandle表明句柄是否能被继承 。

    ● dwCreationDisposition:指定当此端口正在被其它程序占用时采取的动作,因为串口总是存在的,所以此处必须被设置为OPEN_EXISTING ,该标志告诉Windows不要创建新端口,而是打开一个已经存在的端口。

    ● dwFlagsAndAttributes:描述了端口的各种属性,对于文件来说可能有很多种属性,但对于串口来说,唯一有意义的是设置FILE_FLAG_OVERLAPPED属性,当指定该属性时,端口I/O可以在后台进行,这称之为异步I/O重叠结构,更多信息可查看MSDN或其它参考资料。

    ● hTemplateFile:指向模板文件的句柄,对于串口来说,此参数必须设置为0。

    用CreateFile函数打开串COM1的例子如下:

    <span style="font-family:Microsoft YaHei;font-size:18px;">HANDLE hCom;
    DWORD dwError;
    hCom = CreateFile(
    	"COM1",<span style="white-space:pre">						</span>//文件名,这里是串口号
    	GENERIC_READ | GENERIC_WRITE,<span style="white-space:pre">			</span>//充许读和写
    	0,<span style="white-space:pre">						</span>//独占方式
    	NULL,
    	OPEN_EXISTING,<span style="white-space:pre">					</span>//打开而不是创建
    	FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,<span style="white-space:pre">	</span>//异步I/O重叠结构
    	NULL
    	); </span>
    然后还应判断端口是否被正常打开,过程如下:

    <span style="font-family:Microsoft YaHei;font-size:18px;">if(hCom == INVALID_HANDLE_VALUE)
    {
    	dwErrow = GetLastError();//取得错误代码
    }</span>
    如果发生错误,您可以根据取得的错误代码查询到底是什么原因引起的错误。

    2、关闭串口用CloseHandle,其函数声明如下:

    <span style="font-family:Microsoft YaHei;font-size:18px;">BOOL CloseHandle(
    	HANDLE hObject// handle to object
    	);</span>
    这个函数很简单,参数只有一个,这个参数就是要关闭的端口句柄,就是用CreateFile打开端口时返回的句柄。

    二、用VC 打开串口和关闭串口的实例。

    为了直观,程序界面采用MFC编写。创建一个基于对话框MFC应用程序,工程名为OpenCOM,在主对话框中加入两个按钮和组合列表框。下拉列表框预先填入数据:COM1、COM2、COM3和COM4。这样在程序运行后,点击组合列表框就会有四个串行端口可供选择。

    编写“打开串口” 按钮“BN_CLICKED”事件响应代码,内容如下:

    <span style="font-family:Microsoft YaHei;font-size:18px;">CString strSel_COM;//选择想要打开的串口号
    BOOL bComOpened  = NULL;//串口已经被打开标志
    void COpenCOMDlg::OnBtnOpencom()
    {
    	//取得选定串口号
    	((CComboBox*)GetDlgItem(IDC_COMLIST))->GetWindowText(strSel_COM);
    	m_hCom = CreateFile( strSel_COM,<span style="white-space:pre">	</span>//m_hCom的定义为:HANDLE m_hCom;
    		GENERIC_READ | GENERIC_WRITE,<span style="white-space:pre">	</span>//读写模式
    		0,<span style="white-space:pre">				</span>//不共享
    		NULL,<span style="white-space:pre">				</span>//默认安全模式
    		OPEN_EXISTING,<span style="white-space:pre">			</span>//打开方式:打开已经存在的端口
    		NULL,
    		NULL);
    	//验证串口是否被正常打开
    	if( m_hCom == INVALID_HANDLE_VALUE )
    	{
    		CString strMsg;
    		strMsg = "串口" + strSel_COM + "打开失败";
    		AfxMessageBox(strMsg);
    	}
    	else
    	{
    		CString strMsg;
    		strMsg = "串口" + strSel_COM + "被成功打开";
    		AfxMessageBox(strMsg);
    		GetDlgItem(IDC_BTN_OPENCOM)->EnableWindow(FALSE);
    		bComOpened  = TRUE;
    	}
    } </span>
    为了程序启动时组合列表框初始状态选定一个串口号,在主对话框的初始化函数OnInitDialog()里加入如下内容:

    <span style="font-family:Microsoft YaHei;font-size:18px;">((CComboBox*)GetDlgItem(IDC_COMLIST))->SetCurSel(0);</span>
    运行程序,选择一个想要打开的串口号,然后点击“打开串口”按钮,成功则弹出打开成功的对话框,失败则弹出打开失败的对话框,若成功打开串口,“打开串口”按钮将变灰。

    下面来完成关闭串口的功能,编写“关闭串口” 按钮“BN_CLICKED”事件响应代码,内容如下:

    <span style="font-family:Microsoft YaHei;font-size:18px;">void COpenCOMDlg::OnBtnClosecom()
    {
    	if(!bComOpened)
    	{
    		AfxMessageBox("没有串口被打开");
    		return;
    	}
    	if(CloseHandle(m_hCom) == 0)// 调用该函数关闭串口
    	{
    		CString strMsg;
    		strMsg = "关闭串口" + strSel_COM + "失败";
    		AfxMessageBox(strMsg);
    	}
    	else
    	{
    		CString strMsg;
    		strMsg = "关闭串口" + strSel_COM + "成功";
    		AfxMessageBox(strMsg);
    		bComOpened = FALSE;
    		GetDlgItem(IDC_BTN_OPENCOM)->EnableWindow();
    	}
    }</span>

    展开全文
  • WINCE下串口测试编程

    千次阅读 2010-01-08 17:23:00
    串口编程存在的几个问题 1。创建串口接收线程函数这个函数为什么必须为静态函数? 2。静态函数里面调到的函数/变量都必须为静态的函数/变量?(通过this指针就可以避免这样) 3。创建串口接收线程函数传的this指针...

    串口编程存在的几个问题

    1。创建串口接收线程函数这个函数为什么必须为静态函数?
    2。静态函数里面调到的函数/变量都必须为静态的函数/变量?(通过this指针就可以避免这样)
    3。创建串口接收线程函数传的this指针如何灵活使用,当然使用前必须转换一下
    4。很多串口数据怎么传出串口接收线程?通过WPARAM/LPARAM传数组数据的个数是不是有一个上限?这个上限是多少?
    5。一般的LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)也是一个回调函数啊!
    6。回调函数的意义有那些?为什么串口接收线程函数要固定发给回调函数?(通过this指针就可以避免这样)
    7。利用好传给串口接收线程的那个this指针就可以避免必须去使用静态成员函数/变量,通过这个指针就可以访问类的一般成员函数/变量了。


    网上一个不错的串口参考实例
    http://dl3.csdn.net/fd.php?i=80026885801081&s=274c1fe767fc552505479f66a4652f99

    汪兵的《Windows+CE/EVC嵌入式高级编程及其实例详解》书里面也有一个不错的串口参考实例

    //#################################################################################################################

    // 2010_1_7_WINCE50_Com_TestDlg.h : header file
    //

    #if !defined(AFX_2010_1_7_WINCE50_COM_TESTDLG_H__A48FD2F2_B5CC_46E6_98A0_A9CE2FF7183E__INCLUDED_)
    #define AFX_2010_1_7_WINCE50_COM_TESTDLG_H__A48FD2F2_B5CC_46E6_98A0_A9CE2FF7183E__INCLUDED_

    #if _MSC_VER >= 1000
    #pragma once
    #endif // _MSC_VER >= 1000

    /
    // CMy2010_1_7_WINCE50_Com_TestDlg dialog

    class CMy2010_1_7_WINCE50_Com_TestDlg : public CDialog
    {
    // Construction
    public:
     static void ProcessRecData(LPVOID lparam,BYTE* buf,DWORD bufLen);
     void InitButton_State(void);

     // 串口接收线程
     static DWORD WINAPI CommRecvTread(LPVOID lparam);


     void InitCombox_BaudSelect(void);
     void InitCombox_ComSelect(void);

     static HANDLE  ghSerial;
     int m_iCurComNum;
     int m_iCurComBaudRate;

        void Com_Open(CString strCom);
     void Com_Init(int iBaudRate);
     
     CMy2010_1_7_WINCE50_Com_TestDlg(CWnd* pParent = NULL); // standard constructor

    // Dialog Data
     //{{AFX_DATA(CMy2010_1_7_WINCE50_Com_TestDlg)
     enum { IDD = IDD_MY2010_1_7_WINCE50_COM_TEST_DIALOG };
     CComboBox m_BaudRateSelect;
     CComboBox m_ComNumSelect;
     static  CString m_ComReceStr;
     CString m_ComSendStr;
     //}}AFX_DATA

     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(CMy2010_1_7_WINCE50_Com_TestDlg)
     protected:
     virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
     virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
     //}}AFX_VIRTUAL

    // Implementation
    protected:
     HICON m_hIcon;

     // Generated message map functions
     //{{AFX_MSG(CMy2010_1_7_WINCE50_Com_TestDlg)
     virtual BOOL OnInitDialog();
     afx_msg void OnBtnSend();
     afx_msg void OnBtnClearRece();
     afx_msg void OnSelchangeCOMBOBaudSel();
     afx_msg void OnSelchangeCOMBOComSel();
     afx_msg void OnTimer(UINT nIDEvent);
        afx_msg void OnBtnOpenCom();
        afx_msg  void OnBtnKeyBoardTest();
     afx_msg void OnKillfocusEDITComSend();
     afx_msg void OnSetfocusEDITComSend();
     //}}AFX_MSG
     DECLARE_MESSAGE_MAP()
    };

    //{{AFX_INSERT_LOCATION}}
    // Microsoft eMbedded Visual C++ will insert additional declarations immediately before the previous line.

    #endif // !defined(AFX_2010_1_7_WINCE50_COM_TESTDLG_H__A48FD2F2_B5CC_46E6_98A0_A9CE2FF7183E__INCLUDED_)


    //#################################################################################################################
    // 2010_1_7_WINCE50_Com_TestDlg.cpp : implementation file
    //

    #include "stdafx.h"
    #include "2010_1_7_WINCE50_Com_Test.h"
    #include "2010_1_7_WINCE50_Com_TestDlg.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif

     

    #include<Sipapi.h>
    #include "gMsgDef.h"   //2009--10--12  XQH  增加的消息定义!!!

     

    #define   S3C2450   0
    #define   S3C2451   1


    #define   Platform_Using      S3C2450


    #define  WM_ComTest_Base  WM_USER+100
    #define  WM_ComTest_ReceStr    (WM_ComTest_Base+1)

     

    //==============================================================================

    CString  ComNumber[4]=
    {

     _T("COM1:"),
     _T("COM2:"),
     _T("COM3:"),
     _T("COM4:"),

    };

     

    int   ComBaudRate[9]=
    {
        300,//0
     600,
     1200,

        4800,//3
     9600,
     19200,

        38400,//6
     57600,
     115200,
    };

     


    const DWORD DataBitTbl[2] = {7, 8};
    const BYTE  StopBitTbl[3] = {ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS};
    const BYTE  ParityTbl[4] = {NOPARITY, ODDPARITY, EVENPARITY, MARKPARITY};

     

    HANDLE    CMy2010_1_7_WINCE50_Com_TestDlg::ghSerial=NULL;

    CString   CMy2010_1_7_WINCE50_Com_TestDlg::m_ComReceStr=L"";


    char   NumberToChar(unsigned char data)  //数字转字符
    {
        char retval;

       if((data>=0)&&(data<=9))
       {
           retval=data-0+0x30;
       }
       else if((data>=0x0a)&&(data<=0x0f))
       {
            retval=data-0x09+0x40;
       }

       return   retval;


    }

    unsigned char   CharToNumber( char c)  //字符转数字
    {
        unsigned char retval;

       if((c>='0')&&(c<='9'))
       {
           retval=c-0x30;
       }
       else if((c>='a')&&(c<='f'))
       {
            retval=c-0x57;
       }
       else if((c>='A')&&(c<='F'))
       {
            retval=c-0x37;
       }


       return   retval;

    }

    /
    // CMy2010_1_7_WINCE50_Com_TestDlg dialog

    CMy2010_1_7_WINCE50_Com_TestDlg::CMy2010_1_7_WINCE50_Com_TestDlg(CWnd* pParent /*=NULL*/)
     : CDialog(CMy2010_1_7_WINCE50_Com_TestDlg::IDD, pParent)
    {
     //{{AFX_DATA_INIT(CMy2010_1_7_WINCE50_Com_TestDlg)
     m_ComReceStr = _T("");
     m_ComSendStr = _T("");
     //}}AFX_DATA_INIT
     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(CMy2010_1_7_WINCE50_Com_TestDlg)
     DDX_Control(pDX, IDC_COMBO_BaudSel, m_BaudRateSelect);
     DDX_Control(pDX, IDC_COMBO_ComSel, m_ComNumSelect);
     DDX_Text(pDX, IDC_EDIT_ComRece, m_ComReceStr);
     DDX_Text(pDX, IDC_EDIT_ComSend, m_ComSendStr);
     //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(CMy2010_1_7_WINCE50_Com_TestDlg, CDialog)
     //{{AFX_MSG_MAP(CMy2010_1_7_WINCE50_Com_TestDlg)
     ON_BN_CLICKED(IDC_Btn_Send, OnBtnSend)
     ON_BN_CLICKED(IDC_Btn_ClearRece, OnBtnClearRece)
     ON_CBN_SELCHANGE(IDC_COMBO_BaudSel, OnSelchangeCOMBOBaudSel)
     ON_CBN_SELCHANGE(IDC_COMBO_ComSel, OnSelchangeCOMBOComSel)
     ON_WM_TIMER()
        ON_BN_CLICKED(IDC_Btn_OpenCom, OnBtnOpenCom)
        ON_BN_CLICKED(IDC_Btn_KeyBoard_Test, OnBtnKeyBoardTest)
     ON_EN_KILLFOCUS(IDC_EDIT_ComSend, OnKillfocusEDITComSend)
     ON_EN_SETFOCUS(IDC_EDIT_ComSend, OnSetfocusEDITComSend)
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /
    // CMy2010_1_7_WINCE50_Com_TestDlg message handlers

    BOOL CMy2010_1_7_WINCE50_Com_TestDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();

     // Set the icon for this dialog.  The framework does this automatically
     //  when the application's main window is not a dialog
     SetIcon(m_hIcon, TRUE);   // Set big icon
     SetIcon(m_hIcon, FALSE);  // Set small icon
     
     CenterWindow(GetDesktopWindow()); // center to the hpc screen

     // TODO: Add extra initialization here
     

        if(Platform_Using==S3C2450)
      MoveWindow(0,0,480,272);
     else if(Platform_Using==S3C2451)
          MoveWindow(0,0,800,480);


    InitCombox_ComSelect();
    m_iCurComNum=m_ComNumSelect.SetCurSel(2);

     

    InitCombox_BaudSelect();
    m_iCurComBaudRate=m_BaudRateSelect.SetCurSel(5);


    //================================================================================================

    InitButton_State( );

    //==================================================================================================

      //  m_ComSendStr=L"0123456789";  //预置一个值

    m_ComSendStr=L"2e 23 24 44 23";  //预置一个值


     UpdateData(FALSE);

    // SetTimer(1,1000,NULL);


     return TRUE;  // return TRUE  unless you set the focus to a control
    }

     

    void CMy2010_1_7_WINCE50_Com_TestDlg::Com_Open(CString strCom)
    {


    #if   1

    ghSerial = CreateFile(L"COM3:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

    #else

    ghSerial = CreateFile(strCom, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

    #endif

    if(ghSerial)
      RETAILMSG(1,(TEXT("++++Com_Open( )----CreateFile  in success!/n")));
    else
      RETAILMSG(1,(TEXT("++++Com_Open( )----CreateFile  in failure!/n")));

     


    }
    void CMy2010_1_7_WINCE50_Com_TestDlg::Com_Init(int iBaudRate)
    {


    DCB PortDCB;
    PortDCB.DCBlength = sizeof(DCB);

    // 默认串口参数
    GetCommState(ghSerial, &PortDCB);

    //PortDCB.BaudRate = 115200; // baud

    PortDCB.BaudRate =iBaudRate;

     

    PortDCB.ByteSize = 8; // Number of bits/byte, 4-8
    PortDCB.Parity = NOPARITY;
    PortDCB.StopBits = ONESTOPBIT;
    if (! SetCommState(ghSerial, &PortDCB))
    {
     RETAILMSG(1,(TEXT("++++Com_Init( )----SetCommState  in failure!/n")));
    }

    配置超时值

    COMMTIMEOUTS CommTimeouts;

    GetCommTimeouts(ghSerial, &CommTimeouts);
    CommTimeouts.ReadIntervalTimeout = MAXDWORD;
    CommTimeouts.ReadTotalTimeoutMultiplier = 10;
    CommTimeouts.ReadTotalTimeoutConstant = 10;
    CommTimeouts.WriteTotalTimeoutMultiplier = 50;
    CommTimeouts.WriteTotalTimeoutConstant = 100;
    if (!SetCommTimeouts(ghSerial, &CommTimeouts))
    {
     RETAILMSG(1,(TEXT("++++Com_Init( )----SetCommTimeouts  in failure!/n")));
    }

    //==================================================


    //指定端口监测的事件集
     SetCommMask (ghSerial, EV_RXCHAR);

     //分配串口设备缓冲区
     SetupComm(ghSerial,512,512);


     //初始化缓冲区中的信息
     PurgeComm(ghSerial,PURGE_TXCLEAR|PURGE_RXCLEAR);

     


    }
    void CMy2010_1_7_WINCE50_Com_TestDlg::OnBtnSend()
    {
     // TODO: Add your control notification handler code here
     

    #if  1

     


    #if  0

     DWORD dwactlen;

     if (ghSerial== INVALID_HANDLE_VALUE)
     {
      MessageBox(_T("串口未打开!"));
      return;
     }


        m_ComSendStr=L"0123456789";


     UpdateData(TRUE);

     


     int len = m_ComSendStr.GetLength();     /* 取得输入字符串长度 */
     char *psendbuf = new char[len];

     for(int i = 0; i < len;i++)
      psendbuf[i] = (char)m_ComSendStr.GetAt(i);   /* 转换为单字节字符 */

     WriteFile(ghSerial, psendbuf, len, &dwactlen, NULL);  /* 从串口发送数据 */
     
     delete[] psendbuf;

    #else


        int i;
     int iStrLen;
     int iDataNum;
        DWORD dwactlen;


        unsigned char Num;

     BYTE *pDataBuf = NULL;
     BYTE* pRealData=NULL;


         UpdateData(TRUE);

      iStrLen=m_ComSendStr.GetLength( );

     pDataBuf = new BYTE[iStrLen];

     

      iDataNum=0;

      for(i=0;i<iStrLen;i++)
      {
             char c=m_ComSendStr.GetAt(i);

               if(c==_T(' '))
         continue;   

              *(pDataBuf+iDataNum)=CharToNumber(c);
                 iDataNum++;  //有效数据加1


            // RETAILMSG(1,(TEXT("++++1111::OnBtnSend()----the i is %d,the data is 0x%x/r/n"),i,*(pDataBuf+i)));
      }


    unsigned char  LByte,HByte;
    unsigned char  DataByte;


    pRealData=new BYTE[iDataNum/2];


        for(i=0;i<(iDataNum/2);i++)
     {

           HByte=*(pDataBuf+2*i);
           LByte=*(pDataBuf+2*i+1);

        DataByte=HByte*16+LByte;

          *(pRealData+i)=DataByte;

         // RETAILMSG(1,(TEXT("++++2222::OnBtnSend()----the i is %d,the data is 0x%x/r/n"),i,*(pRealData+i)));

     }

        WriteFile(ghSerial, pRealData, iDataNum/2, &dwactlen, NULL);

     


     //释放内存

    delete[] pDataBuf;
     pDataBuf = NULL;


     delete[] pRealData;
     pRealData = NULL;

     

    #endif

     

     


    #else

    //while(1)
    {
        int  i;
        DWORD dwactlen;
        unsigned char  SendByte[10];

     BOOL  bRet;


     for(i=0;i<10;i++)
     {

          SendByte[i]=0x30+i;
     }


        bRet=WriteFile(ghSerial,SendByte, 10, &dwactlen, NULL);

        if(bRet)
         RETAILMSG(1,(TEXT("++++OnBtnSend()----WriteFile in success!/n")));
     else
         RETAILMSG(1,(TEXT("++++OnBtnSend()----WriteFile in failure!/n")));

     Sleep(1000);

    }

    #endif

     

    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::OnBtnClearRece()
    {
     // TODO: Add your control notification handler code here
     

        m_ComReceStr=_T("");

        UpdateData(FALSE); //更新编辑框内容


    }

     

    void CMy2010_1_7_WINCE50_Com_TestDlg::InitCombox_ComSelect()
    {


    m_ComNumSelect.ResetContent();

    m_ComNumSelect.AddString(L"Com1");

    m_ComNumSelect.AddString(L"Com2");

    m_ComNumSelect.AddString(L"Com3");

    m_ComNumSelect.AddString(L"Com4");

    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::InitCombox_BaudSelect()
    {

    m_BaudRateSelect.ResetContent();

    m_BaudRateSelect.AddString(L"300");

    m_BaudRateSelect.AddString(L"600");

    m_BaudRateSelect.AddString(L"1200");


    m_BaudRateSelect.AddString(L"4800");

    m_BaudRateSelect.AddString(L"9600");

    m_BaudRateSelect.AddString(L"19200");

    m_BaudRateSelect.AddString(L"38400");

    m_BaudRateSelect.AddString(L"57600");

    m_BaudRateSelect.AddString(L"115200");

    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::OnSelchangeCOMBOComSel()
    {
     // TODO: Add your control notification handler code here


    // CloseHandle(ghSerial);


    m_iCurComNum=m_ComNumSelect.GetCurSel();

     

     
    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::OnSelchangeCOMBOBaudSel()
    {
     // TODO: Add your control notification handler code here


    // CloseHandle(ghSerial);


    //-----------------------------------------------------------
    m_iCurComBaudRate=m_BaudRateSelect.GetCurSel();

     

    }

    // 串口接收线程
    DWORD CMy2010_1_7_WINCE50_Com_TestDlg::CommRecvTread(LPVOID lparam)
    {

     

     CMy2010_1_7_WINCE50_Com_TestDlg *pDlg = (CMy2010_1_7_WINCE50_Com_TestDlg*)lparam;

     
        DWORD evtMask;
     BYTE * readBuf = NULL;//读取的字节
     DWORD actualReadLen=0;//实际读取的字节数
     DWORD willReadLen;
     
     DWORD dwReadErrors;
     COMSTAT cmState;

        DWORD  k;
        CString strtemp;

     

    //清空串口
     PurgeComm(ghSerial, PURGE_RXCLEAR | PURGE_TXCLEAR );
     SetCommMask (ghSerial, EV_RXCHAR);

      while (TRUE)
      {

            if (WaitCommEvent(ghSerial,&evtMask,0))
      { 

       SetCommMask (ghSerial, EV_RXCHAR);
     
       if(evtMask & EV_RXCHAR)//表示串口收到字符 
       {
        ClearCommError(ghSerial,&dwReadErrors,&cmState);

        willReadLen=cmState.cbInQue;

        if (willReadLen<=0)
        {
         continue;
        }
        
        //分配内存
        readBuf = new BYTE[willReadLen];
        ZeroMemory(readBuf,willReadLen);

        //读取串口数据
        ReadFile(ghSerial, readBuf, willReadLen, &actualReadLen,0);
        
       
        if (actualReadLen>0) //如果读取的数据大于0
        {
         

    #if  0

    /*

                        for(k=0;k<actualReadLen;k++) //将数组转换为Cstring型变量
         {
                          BYTE bt=*(char*)(readBuf+k); //字符型
                          strtemp.Format(L"%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
                          m_ComReceStr+=strtemp; //加入接收编辑框对应字符串
         }
    */


                  ProcessRecData(lparam,readBuf,actualReadLen);


    #else


    /*
    for(k=0;k<actualReadLen;k++) //将数组转换为Cstring型变量
    {
        
       RETAILMSG(1,(TEXT("++++CommRecvTread()----the k is %d,the data is  0x%x!/n"),k,*(readBuf+k)  ));

    }
    */


     CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDIT_ComRece);

       pRecvStrEdit->GetWindowText(m_ComReceStr);


       if(m_ComReceStr!=L"")
       m_ComReceStr+=L"/r/n";

     

      for(k=0;k<actualReadLen;k++) //将数组转换为Cstring型变量
      {
                          BYTE bt=*(char*)(readBuf+k); //字符型
                          strtemp.Format(L"%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
                          m_ComReceStr+=strtemp; //加入接收编辑框对应字符串
     }

        pRecvStrEdit->SetWindowText(m_ComReceStr);

     

    #endif

        }

                //   m_ComReceStr+=L"/r/n";


                   //UpdateData(FALSE); //更新编辑框内容

           //SendMessage(WM_ComTest_ReceStr,NULL,NULL);

                  // ProcessRecData(lparam);


         // pDlg->PostMessage(WM_ComTest_ReceStr,NULL,NULL);  //ok

        //this->PostMessage(WM_ComTest_ReceStr,NULL,NULL);


        delete[] readBuf;//释放内存
        readBuf = NULL;

     

     

       }//if (evtMask & EV_RXCHAR)


      }//if (WaitCommEvent(ghSerial,&evtMask,0))

     

      }//while (TRUE)


     return 0;
    }

     


    void CMy2010_1_7_WINCE50_Com_TestDlg::OnTimer(UINT nIDEvent)
    {
     // TODO: Add your message handler code here and/or call default
     
        if(nIDEvent==1)
     {


           RETAILMSG(1,(TEXT("++++OnTimer( )----if(nIDEvent==1)!/n")));


           UpdateData(FALSE); //更新编辑框内容

     }

     

     CDialog::OnTimer(nIDEvent);
    }


    void CMy2010_1_7_WINCE50_Com_TestDlg::OnBtnOpenCom()
    {

     

    CString  str;
    str=ComNumber[m_iCurComNum];


    #if  1

    Com_Open(str);

    #else

     

    #if   1
        ghSerial = CreateFile(L"COM3:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    #else
         ghSerial = CreateFile(str,GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    #endif

    if(ghSerial)
      RETAILMSG(1,(TEXT("++++Com_Open( )----CreateFile  in success!/n")));
    else
      RETAILMSG(1,(TEXT("++++Com_Open( )----CreateFile  in failure!/n")));

     

    #endif

     


    int  iBaudRate;
    iBaudRate=ComBaudRate[m_iCurComBaudRate];

    Com_Init(iBaudRate);


    //=================================================================================================

     DWORD IDThread;
     HANDLE hRecvThread; 

    // 创建串口接收线程
     hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);

       //hRecvThread = CreateThread(0, 0, CommRecvTread, NULL, 0, &IDThread);  //NO ok
     if (hRecvThread == NULL)
     {
       RETAILMSG(1,(TEXT("++++OnInitDialog( )----CreateThread  in failure!/n")));
     } 

     CloseHandle(hRecvThread);


    //=====================================

    CButton* btn0=(CButton*)GetDlgItem(IDC_Btn_OpenCom);
    btn0->EnableWindow(FALSE);

     

    CButton* btn1=(CButton*)GetDlgItem(IDC_Btn_Send);
    btn1->EnableWindow(TRUE);


    CButton* btn2=(CButton*)GetDlgItem(IDC_Btn_ClearRece);
    btn2->EnableWindow(TRUE);

     

    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::InitButton_State()
    {


    CButton* btn0=(CButton*)GetDlgItem(IDC_Btn_OpenCom);
    btn0->EnableWindow(TRUE);

     

    CButton* btn1=(CButton*)GetDlgItem(IDC_Btn_Send);
    btn1->EnableWindow(FALSE);


    CButton* btn2=(CButton*)GetDlgItem(IDC_Btn_ClearRece);
    btn2->EnableWindow(FALSE);


    }
    void CMy2010_1_7_WINCE50_Com_TestDlg::OnBtnKeyBoardTest()
    {

    static  int  iStatus=0;

    iStatus++;

    if(iStatus%2==1)
    SipShowIM(1);
    else
    SipShowIM(0);


    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::OnKillfocusEDITComSend()
    {
     // TODO: Add your control notification handler code here

     SipShowIM(0);


    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::OnSetfocusEDITComSend()
    {
     // TODO: Add your control notification handler code here
     
    SipShowIM(1);

    }

    void CMy2010_1_7_WINCE50_Com_TestDlg::ProcessRecData(LPVOID lparam,BYTE* buf,DWORD bufLen)
    {

     CMy2010_1_7_WINCE50_Com_TestDlg *pDlg = (CMy2010_1_7_WINCE50_Com_TestDlg*)lparam;

     

     // pDlg->PostMessage(WM_RECV_SERIAL_DATA, buf,bufLen);
     pDlg->PostMessage(WM_RECV_SERIAL_DATA, WPARAM(buf),bufLen);

     

     

     

    }

    LRESULT CMy2010_1_7_WINCE50_Com_TestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
     // TODO: Add your specialized code here and/or call the base class

     int k;

     CString  strtemp;
        BYTE bt;
    BYTE *pBuf;
    DWORD dwBufLen;

     switch(message)
       {

        case   WM_RECV_SERIAL_DATA:

     pBuf=(BYTE*)wParam;
     dwBufLen=lParam;
     
    for(k=0;k<dwBufLen;k++) //将数组转换为Cstring型变量
      {
                          bt=*(BYTE*)(pBuf+k); //字符型
                          strtemp.Format(L"%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
                          m_ComReceStr+=strtemp; //加入接收编辑框对应字符串
     }

     


     //释放内存
     delete[] pBuf;
     pBuf = NULL;

     m_ComReceStr+=L"/r/n";


    UpdateData(FALSE); //更新编辑框内容


      break;

     


       case   WM_SPI_DirectionKey:

          RETAILMSG(1,(TEXT("[HSP] ++++WindowProc(  )----case   WM_SPI_DirectionKey/r/n"))); 


        break;

     case   WM_SPI_PanelKey:

          RETAILMSG(1,(TEXT("[HSP] ++++WindowProc(  )----case   WM_SPI_PanelKey/r/n"))); 


        break;

       }

     

     return CDialog::WindowProc(message, wParam, lParam);
    }

     

    展开全文
  • 如图,如果打开COM2后,点了COM1,怎么对电脑里是否有此串口作出判断呢?有这个串口则打开这个串口,没有这个串口时作出提示
  • C#串口编程

    2014-09-17 15:28:25
    刚到新公司我独立做的第一个小项目需要用到串口通讯方面的知识,虽说对于串口通讯并不陌生,但是具体怎么用C#来实现还真是没有十足的把握,于是就上网搜C#串口编程方面的资料来看。 经过一周的学习终于把C#串口编程...
  • 教你怎么串口编程,提供了很多实例。
  • 因为在电脑上,可以输入03 01 00 02 00 c4这样的一组数,...请问这样的问题应该怎么解决,因为十进制数穿换成十六进制数简单,但是转换出来就是char类型的字符串,就不是数组数据了</p>
  • C#实现串口通信编程

    2011-08-12 09:50:32
    在C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到"怎么用MSCOMM实现串口通信"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。 通常,在C#中实现串口通信,我们有...
  • C语言下的串口编程

    2011-12-02 17:07:37
    串口编程方面的,有怎么设置串口,对串口的操作等
  • Linux 串口编程

    千次阅读 2014-08-04 22:32:13
    Linux串口编程老生常谈了,已经做过很多次,但有些细节没次都要翻遍百度才能找到答案,这里做笔记记录下 1.首先先包含一些头文件,这里只做应用的方法介绍,具体头文件怎么回事,自个百度 #include #include #...
  • C#的串口编程

    2015-10-21 14:05:00
    C#的串口编程 对于串口编程,熟悉的应该觉得不困难。.NET下就更容易了,废话也没了。开始吧。1.虚拟串口软件由于手上没有串口硬件,所以在网上找了一个 VSPM 虚拟串口软件 ,据说是免费的。下载地址:...
  • java串口编程小实例

    热门讨论 2013-07-29 22:02:43
    这个是一个java串口编程实例,里面的代码写了怎么连接串口怎么接收数据等等。后面会有文档附上,一块下载下来看看就懂了,一定可以看懂,很简单。
  • 基于QT的串口通信,内涵丰富教程和源码,用户可以通过它学习怎么使用QT进行编程
  • Linux串口编程

    2013-10-15 12:17:10
    之前一直在纠结这个怎么做,其实就是一个读写文件的流程,需要配置下串口的参数。 不过有意思的地方更在于,一,串口是可以作为终端的,linux终端tty是很有意思的,二,串口的配置涉及缓冲区设计,这点又和C语言的...
  • 1、串口编程步骤 1.1 看原理图确定引脚 1.2 配置引脚为UART功能 1.3 设置串口参数 1.4 根据状态寄存器读写数据 2、STM32F103串口框架 3、STM32F103串口操作 3.1 看原理图确定引脚 3.2 配置引脚为UART功能 ...
  • JAVA串口编程.txt

    2010-12-09 14:02:09
    JAVA串口编程.txt不知道大家用了这个效果怎么样!大家互相学习帮助!
  • Linux下的串口编程

    2014-09-12 21:13:12
    但是我们对于linux下的串口编程了解多少呢,咱们应该怎么玩呢? 和其他设备一样,Linux也是通过设备文件来提供访问串口的功能。当需要访问串口的时候,你只需要open相应的文件。 Linux系统上一般有一个或者多个...
  • 物联网,万物互联。这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起。最简单、最广泛使用的就是互联网。...说白了,只是个WIFI转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透...
  • Qt串口编程教程.rar

    2010-12-28 08:39:19
    这是一个用串口编程教程,里面很详细的讲解怎么去定义,怎么去调用,怎么使用串口,以及在linux下和windows下实现串口通信的可视化,对于做串口通信的朋友很有用的,这里的很多源代码可以直接使用。
  • 我现在板子上是一个虚拟串口,遵循的是usb cdc 协议,所以应该跟C#打开实际的物理串口不一样,执行程序我代码serialPort1.Open();会报错“连到系统上的设备没有发挥作用”。 [img=...
  • 比特说串口编程

    2020-10-03 11:36:42
    在1.X系列的文章中,我们从最开始的灯泡的例子开始,一步步深入,知道了CPU是怎么工作的,配合内存可以自动工作。 前面的内容基本上是CPU工作原理的完整轮廓了。 我们知道现在使用的各种形态的计算机除了CPU...
  • ![![图片说明](https://img-ask.csdn.net/upload/201604/08/1460126571_89227.jpg)图片说明](https://img-ask.csdn.net/upload/201604/08/1460126554_227039.jpg)

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 191
精华内容 76
关键字:

串口怎么编程