精华内容
下载资源
问答
  • 串口数据传输

    2018-03-12 15:57:24
    基于LABVIEW的串口通信程序,可以发送数据给远端的服务器。
  • labview 2020 sp1 版本 编写的串口数据传输,希望能帮助需要的朋友。
  • VB 串口 数据传输

    2009-05-11 09:59:45
    VB 串口 数据传输 简单的VB程序,实现文字传输功能
  • 串口数据传输助手.rar

    2012-08-10 16:17:53
    串口数据传输助手 用于测试串口的通讯情况。
  • VS与单片机串口数据传输、计算机与单片机通信 在VS2017里写的,亲测可用
  • Proteus和LabVIEW联合仿真,实现串口数据传输及波形显示。压缩包内包含Proteus仿真文件、51单片机代码、LabVIEW上位机代码、以及演示视频地址。
  • 串口数据传输程序

    2018-02-04 19:54:59
    VC++串口编程教学源码,串口学习的好东西
  • 利用MSComm控件进行串口数据传输 C++课程设计案例精编 vc++mfc编程案例
  • 最近在和自己的小组捣鼓怎么将STM32的串口数据传输到MQTT服务器上,由于是第一次,所有走了一些弯路。在这里分享一下自己的这次经验。在开始之前,我想对我另外的两个队员:小杨、小行,说:你们幸苦了! 在开始...

    最近在和自己的小组捣鼓怎么将STM32的串口数据传输到MQTT服务器上,由于是第一次,所有走了一些弯路。在这里分享一下自己的这次经验。在开始之前,我想对我另外的两个队员:小杨、小行,说:你们幸苦了!

    在开始之前,你得要会lua语言,并且要配置ESP8266的环境,在这里我推荐一个视频 ----> 视频地址。这个视频里详细的说了怎么配置ESP8266环境,并且也介绍了lua语言,个人认为足够用了,比较适合刚刚接触这个的人。

    然后接下进行第一步,STM32与ESP8266的连接,开始我也琢磨怎么连接,结果就是最简单的连接就行了,STM32上的RXD连ESP8266上的TXD,剩下的类推就行了,然后在ESP8266中写入一个串口接收程序就行了。
    程序很简单:

    uart.on("data",function(data)
        tmr.delay(1)
        print("从串口读取的数据:",data)
    end, 0)

    这里要注意的一点,这个串口接收程序不能一开始就写,否则后面写入的程序可能会报错。

    接下来就是ESP8266连接WiFi了,连接WiFi的程序如下:

    wifi.setmode(wifi.STATION)
    wifi.sta.config("SSID","PASSWORD") //SSID WiFi名称,PASSWORD WiFi密码
    wifi.sta.connect()
    tmr.delay(500000)
    print(wifi.sta.getip())

    当看到返回了ip地址,表明连接已成功。

    然后就是配置MQTT了。
    配置如下:

    m=mqtt.Client(Clientid,3,MqttUserName,MqttUserPassword)
    m:connect(MqttServerIP, MqttServerPort, 0,
    	function(client)
    		print("connected")
    	end
    )
    m:lwt("/lwt", "offline", 0, 0)
    m:on("connect", function(client) print ("connected") end)
    m:on("offline", function(client) print ("offline") end)

    里面的一些配置需要根据自己的情况设置参数。

    Clientid:mqtt客户端ID(唯一).
    MqttUserName:Mqtt服务器用户名.
    MqttUserPassword:Mqtt服务器用户名密码.
    MqttServerIP:Mqtt服务器ip.
    MqttServerPort:Mqtt服务器端口.

    然后进行连接,当看到 connected 则表明连接已成功。

    当到这一步,基本已经成功了。上面的都是一步步测试程序。
    接下来给上init程序:

    wifi.setmode(wifi.STATION)
    wifi.sta.config("SSID","PASSWORD")
    wifi.sta.connect()
    tmr.alarm(1, 1000, 1, function()
    	if wifi.sta.getip()== nil then
      		print("IP unavaiable, Waiting...")
     	else
        		tmr.stop(1)
      		print("Config done, IP is "..wifi.sta.getip())
      		m=mqtt.Client(Clientid,3,MqttUserName,MqttUserPassword)
      		m:connect(MqttServerIP, MqttServerPort, 0,
       			function(client)
        				print("connected")
       			end
      		)
      		m:lwt("/lwt", "offline", 0, 0)
      		m:on("connect", function(client) print ("connected") end)
      		m:on("offline", function(client) print ("offline") end)
      		uart.on("data",
       			function(data)
        				m:publish("demo",data,0,1,
         					function(m)
         					end
        				)
        				data = 0
       			end
      		)
     	end
     end
    )

    好了,到这正式结束了。其实弄懂了流程就很简单,就是开始接触时不知道往哪下手。再次提醒下,以上程序代码都是用lua语言编写的。所以一定要有lua语言基础。

    然后,然后,最后再表扬下我的两个队友:小杨,小行。很棒!

    展开全文
  • 在单片机应用领域,串口是上位机和下位机进行通信和数据交换的重要方式,但由于浮点型数据占用字节数超过了一个字节,故无法通过串口进行直接传输,涉及到数据的分散和合成,本VI即为解决该问题而编写。通过适当的...
  • 两个例程 例程1:摄像头识别小圆,然后通过串口输出小圆的xy坐标。单片机可以直接接受,...例程2:VSwin32命令控制台程序 调用串口,可以根据自己需要配置串口,完成windows与单片机的数据传输。可作为开发参考使用。
  • 嵌入式系统的串口数据传输都是以字节为单位,但是有些特殊的数据类型,比如浮点型float a=231.5,在内存是如何表示的呢?我们知道浮点型float数据类型占用4个字节,实际上在内存当中a=0x43678000,只是嵌入式芯片...

    嵌入式系统的串口数据传输都是以字节为单位,但是有些特殊的数据类型,比如浮点型float a=231.5,在内存是如何表示的呢?我们知道浮点型float数据类型占用4个字节,实际上在内存当中a=0x43678000,只是嵌入式芯片访问a时,知道a是浮点型数据,所以一次性读取4个字节,而且也按照浮点型的数据表示规定,将a转换为十进制的可读数据231.5。如果我们从串口接收到4个字节数据{0x43,0x67,0x80,0x00},如何把这4个字节的数据转换为float型呢?直接令float a=0x43678000这是不行的(不信的读者可以自行验证),这就是串口通讯当中经常遇到的问题,如果数据传输中包括了浮点型数据,在这里我们可以通过共用体或者结构体来解决。

    对于共用体

    typedef union
    {
      float f;
      unsigned char s[4];
    }Union_test;

    f的4个字节和s[4]的4个字节是共用一个区域,如果我们令f=231.5,然后通过VS2008的监视窗查看s[4]的数值,下面是测试程序

     1 #include <stdio.h>
     2 //共用体
     3 //float f;//4个字节
     4 //char s[4];//4个字节
     5 typedef union
     6 {
     7     float f;
     8     unsigned char s[4]; 
     9 }Union_test;
    10 typedef struct st
    11 {
    12     float f1;
    13 }Struct_test;
    14 void main(void)
    15 {
    16     float a=231.5;
    17     Union_test x;
    18     Struct_test z;
    19     x.f = a;
    20     z = *(Struct_test *)(&(x.s));
    21     printf("z=%.2f\r\n",(double)z.f1);
    22     printf("End of this programme\r\n");
    23 }

    监视结果如下所示

    我们同样适用结构体做了相同的实验,将数组s[4]={0x00,0x80,0x67,0x43}的首地址s[0]强制转换赋值给结构体z,最后打印输出的结果也是231.5

    这里我们看到原本应该是0x4367_8000的数据实际存储的时候变成了00H 80H 67H 43H,这是因为计算机系统使用了小端存储,什么是小端存储呢?

    我们都知道,对于一个超过一个字节的数据,其在计算机中的存储需要跨越字节。某些机器选择在存储器中按照从最低为有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高为有效字节到到最低为有效字节的顺序存储,前一种存储方式被称为小端存储,后一种方式被称为大端存储。

    举个例子,对于十六进制数0x01234567,其字节的存储顺序便依赖于机器,如下
    我们可以通过下面的函数测试是大端存储还是小端存储
    1 void test(void)
    2 {
    3     int a = 1;
    4     unsigned char *start=&a;
    5     if(*start == 1)
    6         printf("小端存储");
    7     else if(*start == 0)
    8         printf("大端存储");
    9 }

     

     附录:结构体的定义方法

    1.先定义结构,再说明结构变量。 如:

    1 struct stu
    2 {
    3     int num;
    4     char name[20];
    5     int age;
    6 };
    7 struct stu boy1,boy2;

    说明了两个变量boy1和boy2为stu结构类型。

     

    2.在定义结构类型的同时说明结构变量。例如:

    1 struct stu
    2 {
    3     int num;
    4     char name[20];
    5     int age;
    6 }boy1,boy2;

    3.直接说明结构变量。

    1 struct
    2 {
    3     int num;
    4     char name[20];
    5     int age;
    6 }boy1,boy2;  

    第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。

    说明了boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。

    参考网址:http://blog.csdn.net/xiaoyali/article/details/4393486

    转载于:https://www.cnblogs.com/codecamel/p/4703174.html

    展开全文
  • API实现串口数据传输

    2011-08-17 12:00:32
    实现调用API函数进行RS232串口通讯,功能稳定,可用于PC与RS232设备数据互传
  • 这个与我之前上传相比,只要1积分可惜没有免费的选项,欢迎大家下载使用。...例程2:VSwin32命令控制台程序 调用串口,可以根据自己需要配置串口,完成windows与单片机的数据传输。可作为开发参考使用。
  • 系统结构如图所示,要求,PC端用串口精灵/串口调试助手等软件实现,通信波特率19.2kbps,通过PC端每次发送数据,控制8bitLED完成下表功能: 命令 LED状态 SX 单个LED顺序流水(0-7) NX 单个LED逆序流水(7-0) JF ...
  • 串口数据传输助手

    2006-03-16 00:00:00
    串口通讯工具
  • 通过串口发送的数据,在U盘上生成文件并保存.使用CH375作为USB HOST芯片,STM32为主控CPUUSB代码部分采用CH375官方库,并加以一定程度的封装.此库功能稍微有限, 同一时间只支持一个文件的打开读写.含有原理图,PCB板,...
  • 在rs232通信中用软件进行串口通信的源代码
  • 1.目的是想通过上位机LabVIEW编程,实现通过USB串口传输至树莓派,树莓派接收到数据后显示,并把收到的数据返还给上位机。 2.树莓派USB串口编程: (1)在网上借阅有关树莓派USB通信,就会发现,Python有自带的...

    1.目的是想通过上位机LabVIEW编程,实现通过USB串口传输至树莓派,树莓派接收到数据后显示,并把收到的数据返还给上位机。

    2.树莓派USB串口编程:

    (1)在网上借阅有关树莓派USB通信,就会发现,Python有自带的Pyserial模块,可以进行串口设置

        安装指令:pip install Pyserial

    (2)查看USB串口端情况,在接入一跟USB数据线后,树莓派会刷新显示:

        查找指令:lsusb

    (3)Python编程:

    1).将串口设置为‘/dev/ttyUSB0, 115200’

    2).实现功能是:等待串口数据接收,若有数据,则进行回显并把数据发送至上位机

    3.上位机LabVIEW编程:

    (1)功能是实现命令的发送和显示接收到的数据(下位机发送过来的数据)

    (2)上图是LabVIEW串口程序的接收模块,因为下位机只是将接收到的数据,再反馈给上位机,所以数据中没有设置字节大小。故采用Bytes at Port函数进行接收判断,它的原理是只要收到数据(大小≥1),就把数据给VISA R。

    采用10ms延时,则是延长接收时间,使接收的数据更完整。否则接收框会清空(接收框没有设置反馈节点),只显示最近一次接收的数据。

    (3)只要电脑上接入USB线,LabVIEW就会刷新,可以看到“端口选择”列表中就会多一个端口,就表示此USB线。波特率与树莓派保持一致为115200。

    4.运行程序结果

    (1)此图为最后一次发送数据命令,接收框能收到树莓派回传的信息。

    (2).树莓派接收到上位机LabVIEW的数据,并实时显示。

     

    转载于:https://www.cnblogs.com/Ding-Feng/p/7623680.html

    展开全文
  • /// 接收串口数据线程 /// private Thread recMsgThread; /// /// 解析数据处理队列 /// private WorkQueue[]> parseDataProcQueue = new WorkQueue[]>(); /// /// 刷卡事件处理队列 /// private ...

    COM1

    设计页面:

    在这里插入图片描述

    源码:

           public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    SerialPort sp = new SerialPort(this.txtPort.Text, 9600, Parity.None, 8, StopBits.One);
                    //SerialPort sp = new SerialPort(this.txtPort.Text);
                    byte[] m = new byte[13];
                    m[0] = 0x42;
    
                    byte[] cardnoArr = System.Text.Encoding.ASCII.GetBytes(this.txtMsg.Text);
    
                    for (int i = 1; i <= 10; i++ )
                    {
                        if (i <= cardnoArr.Length)
                        {
                            m[i] = cardnoArr[i - 1];
                        }
                        else 
                        {
                            m[i] = 0x20;
                        }
                       
                    }
    
                    int v = 0;
                    for (int i = 0; i < 11; i++ )
                    {
                        v += m[i];
                    }
    
                    m[12] = (byte)(v);
                    m[11] = (byte)(v >> 8);
    
                    //打开新的串行端口连接
                    sp.Open();
                    //丢弃来自串行驱动程序的接受缓冲区的数据
                    sp.DiscardInBuffer();
                    //丢弃来自串行驱动程序的传输缓冲区的数据
                    sp.DiscardOutBuffer();
    
                    //使用缓冲区的数据将指定数量的字节写入串行端口
                    sp.Write(m, 0, m.Length);
                    //关闭端口连接
                    sp.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                
            }
    
            private string StringToHexString(string s, Encoding encode)
            {
                byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组
                string result = string.Empty;
                for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符,以%隔开
                {
                    result += "%" + Convert.ToString(b[i], 16);
                }
                return result;
            }
    

    COM2

    设计页面

    在这里插入图片描述

    代码:

           public Form1()
            {
                InitializeComponent();
            }
    
            private ILog logger = LogManager.GetLogger(typeof(Form1));
    
            /// <summary>
            /// 接收串口数据线程
            /// </summary>
            private Thread recMsgThread;
    
            /// <summary>
            /// 解析数据处理队列
            /// </summary>
            private WorkQueue<byte[]> parseDataProcQueue = new WorkQueue<byte[]>();
    
            /// <summary>
            /// 刷卡事件处理队列
            /// </summary>
            private WorkQueue<long> creditCardEventProcQueue = new WorkQueue<long>();
    
            private SerialPort sp = null;
    
            private bool shouldStop = false;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                parseDataProcQueue.WorkSequential = true;
                parseDataProcQueue.UserWork += new UserWorkEventHandler<byte[]>(ParsedData_UserWork);
    
                creditCardEventProcQueue.UserWork += new UserWorkEventHandler<long>(CreditCardEvent_UserWork); 
            }
    
            /// <summary>
            /// 接收串口数据
            /// </summary>
            private void RecPortMsg()
            {
                byte[] b;
                byte[] recArr;
                
    
                while (!shouldStop)
                {
                    try
                    {
                        sp = new SerialPort(txtPort.Text, 9600, Parity.None, 8, StopBits.One);
                        //sp = new SerialPort(txtPort.Text);
                        //打开新的串行端口连接
                        sp.Open();
    
                        logger.Info(string.Format("SerialPort open success.{0}", txtPort.Text));
    
    
                        //丢弃来自串行驱动程序的接受缓冲区的数据
                        sp.DiscardInBuffer();
                        //丢弃来自串行驱动程序的传输缓冲区的数据
                        sp.DiscardOutBuffer();
    
                        StringBuilder sb = new StringBuilder();
    
                        while (!shouldStop)
                        {
                            b = new byte[32];
                            //从串口输入缓冲区读取一些字节
                            int n = sp.Read(b, 0, b.Length);
    
                            if(n > 0)
                            {
                                recArr = new byte[n];
    
                                for (int i = 0; i < n; i++ )
                                {
                                    recArr[i] = b[i];
                                }
    
                                //放入解析队列
                                parseDataProcQueue.EnqueueItem(recArr);
                            }
    
                            //当前线程挂起200毫秒
                            System.Threading.Thread.Sleep(200);
                        }
                    }
                    catch (Exception ex)
                    {
    
                        logger.Error(string.Format("RecPortMsg error.{0}", ex.Message));
                    }
    
                    System.Threading.Thread.Sleep(2000);
                }
    
                if (null != sp)
                {
                    //关闭端口连接
                    sp.Close();
                }
                
            }
    
    
            //10进制卡号按以下格式编码(16进制):42 xx xx xx xx xx xx 20 20 20 20 HH LL
            //注:通信包定长13bytes,包头以'B'开始,16进制0x42;
            //后跟10位卡号,以16进制ASCII码值发送;
            //卡号不满10位时,后补0x20(空格);
            //校验码计算:前11位的16进制值累加,2bytes,高位bytes+低位bytes。
    
    
            //数据包
            private byte[] dataPacket = new byte[13];
            private int i_data = 0;
            private bool hasFind = false;
    
            /// <summary>
            /// 解析数据-工作处理
            /// </summary>
            private void ParsedData_UserWork(object sender, WorkQueue<byte[]>.EnqueueEventArgs e)
            {
                byte bStart = 0x42; //通讯包头部
    
                byte[] recArr = e.Item;
    
                try
                {
                    foreach (byte b in recArr)
                    {
                        if (b == bStart)
                        {
                            hasFind = true;
                            dataPacket = new byte[13];
                            i_data = 0;
                        }
    
                        if (hasFind)
                        {
                            if (i_data <= 12)
                            {
                                dataPacket[i_data++] = b;
    
                                if (i_data == 13) //完整包
                                {
    
                                    //校验数据有效性
                                    if (CheckDataValid(dataPacket))
                                    {
                                        //解析获取卡号
                                        long cardno = parseCardNo(dataPacket);
    
                                        logger.InfoFormat("Rec CardNo:{0}", cardno);
    
                                        //回复
                                        if (null != sp)
                                        {
                                            byte[] postdata = new byte[2];
                                            //返回成功
                                            postdata[0] = 0x44;
                                            postdata[1] = 0x59;
                                            sp.Write(postdata, 0, postdata.Length);
                                        }
    
    
                                        //放入刷卡事件处理队列
                                        creditCardEventProcQueue.EnqueueItem(cardno);
                                    }
    
                                    hasFind = false;
                                }
                            }
    
                        }
                    }
                }
                catch (Exception ex1)
                {
                    logger.Error(string.Format("Parse data error.{0}", ex1.Message));
                }
                
            }
    
            /// <summary>
            /// 校验数据包是否是有效的
            /// 校验码计算:前11位的16进制值累加,2bytes,高位bytes+低位bytes。
            /// </summary>
            /// <param name="dataPacket"></param>
            /// <returns></returns>
            private bool CheckDataValid(byte[] dataPacket)
            {
                bool valid = false;
    
                int v = 0;
                for (int i = 0; i < 11; i++)
                {
                    v += dataPacket[i];
                }
    
                byte LL = (byte)(v);
                byte HH = (byte)(v >> 8);
    
                if (dataPacket[11] == HH && dataPacket[12] == LL)
                {
                    valid = true;
                }
    
                return valid;
            }
    
            //解析获取卡号
            private long parseCardNo(byte[] dataPacket) 
            {
                byte bSpace = 0x20; //空格
    
                //获取卡号
                string s_cardno = "";
                long cardno = 0;
    
                for (int i = 1; i < 11; i++)
                {
                    if (dataPacket[i] != bSpace)
                    {
                        s_cardno += (char)dataPacket[i];
                    }
    
                }
    
                cardno = long.Parse(s_cardno);
    
                return cardno;
            }
    
            /// <summary>
            /// 刷卡事件-工作处理
            /// </summary>
            private void CreditCardEvent_UserWork(object sender, WorkQueue<long>.EnqueueEventArgs e)
            {
                long cardno = e.Item;
                ShowCardNo(cardno.ToString());
            }
    
            /// <summary>
            /// 显示卡号
            /// </summary>
            /// <param name="msg"></param>
            private void ShowCardNo(string msg)
            {
                if (InvokeRequired)
                {
                    Invoke(new MethodInvoker(delegate { ShowCardNo(msg); }));
                    return;
                }
    
                txtMsg.Text = msg;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                recMsgThread = new Thread(new ThreadStart(RecPortMsg));
                recMsgThread.Start();
    
                button1.Enabled = false;
                button2.Enabled = true;
    
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                Stop();
    
                button2.Enabled = false;
                button1.Enabled = true;
                
            }
    
    
            private void Stop()
            {
                this.shouldStop = true;
    
                if (null != recMsgThread)
                {
                    recMsgThread.Abort();
                }
    
                if (null != sp)
                {
                    //关闭端口连接
                    sp.Close();
                }
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                Stop();
            }
    
    
    展开全文
  • BLE技术现在越来越流行,因此许多领域正在使用BLE技术进行无线数据传输,BLE包括以下功能: *功耗低 *易于开发 *支持网状网络 *性价比高 *大多是小尺寸 飞易通低功耗蓝牙方案,专注于无线通信产品的开发,产品兼容...
  • (如果相反只要改一下设备名称和一些传输的方式就行了) 除此之外就是如何编写Makefile的一些问题,其余有什么问题可以咨询QQ:2821072611,随时解答。 首先是开发板即发送端: /**********server.c***********/ ...
  • FSC-BT691是使用Dialog DA14531 BLE 5.1芯片的超低功耗蓝牙模块,它支持GATT,ATT,GAP等配置文件。它提供了几个可定制的硬件接口,例如UART,SPI,I2C,AIO,PIO等。 FSC-BT691是带有PCB板载天线的超小...默认的串口
  • 基于arm的开发板串口与dsp28335的串口进行通信,从arm的Linux系统中将一个HEX文件通过arm串口传输,如何保证dsp接收端收到文件数据的准确性、完整性?
  •  如果使用的是内部的16MHz时钟,这三行初始化代码应该可以启动串口传输数据,但是我发现数据传输的过程中出错,刚开始也怀疑是串口配置出错,假如配置出错,理论上是不会收到数据的,上面的代码能在内部时钟下...
  • 大海捞针找到了个win32命令控制台的串口例程 ,自己改了一下贡献出来。   直接调用API实现串口通信   两个例程 如果编译运行有问题 直接复制源文件到新win32命令工程中运行 平台-VS2013-win32 例程1:摄像头...
  • 很不错的FPGA ucos II 开发教程,需要的下载,只要2分
  • 项目基本实现和功能如下: 1、配置使用stm32 cubeMx ...6、在实现过程中发现在改环境下两个进程可以同时对串口数据进行读写,数据不会干扰太严重 电脑串口发送数据给单片机: #!/usr/bin/py...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,576
精华内容 2,630
关键字:

串口数据传输