串口发送数据类

C#串口通信程序SerialPort类 上篇文章主要是关于串口通信中单片机部分的程序编写。在实际应用中,常常还要有上位机的配合才能完成工作。写串口通信的上位机程序,常常应用的编程语言有C++,VB,C#等。VB没有学过,C++编写窗口应用程序接触也不多,暑假自己看了一些C#的书,也有了一些了解,所以就用C#写窗口应用程序,用来作上位PC机的串口通信程序。在写的过程中,主要参见了这篇博客http://blog.youkuaiyun.com/wuyaz 阅读详情
using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.ComponentModel;
namespace StringToLed
{
    
class stringtoLed
    
{
        
private System.IO.Ports.SerialPort serialPort1 = new SerialPort();

        
public  void write(string senStr)
        
{
            
string headStr = "23 14 24 15 13 18 58 58 58 58 58 58 44 01 01 00 01 01 02 04";
            
string footStr = "0A 2C 0E 16 04 02 08 6F";
            
string midStr = "";
            
string myStr = string.Empty;
            
// " 23 14 24 15 13 18 58 58 58 58 58 58 44 01 01 00 01 01 02 04C4 E3 BA C3 B0 A1 A3 A10A 2C 0E 16 04 02 08 6F";
            midStr = BitConverter.ToString(ASCIIEncoding.Default.GetBytes(senStr.Trim())).Replace("-", " ");
            
//midStr = "C4 E3 BA C3 B0 A1 A3 A1";
            myStr = headStr.Trim() + " "+midStr.Trim()+" "+ footStr.Trim();

            serialPort1.PortName 
= "COM1";  //端口号
            serialPort1.BaudRate = 9600;   //比特率
            serialPort1.Parity = Parity.None;//奇偶校验
            serialPort1.StopBits = StopBits.One;//停止位
            serialPort1.ReadTimeout = 1000; //读超时,即在1000内未读到数据就引起超时异常
            serialPort1.Open();

            
byte[] myByte = StringToByte(myStr.Trim());

            serialPort1.Write(myByte, 
0, myByte.Length);
            serialPort1.Close();
          
//  MessageBox.Show("数据发送成功!", "系统提示");
        }

        
/// <summary>
        
/// 默认发送:左推,速度1,停留0
        
/// </summary>
        
/// <param name="sendStr">发送得数据</param>

        public void writeCom(string sendStr)
        
{

            
string headStr = "23 14 24 15 13 18 58 58 58 58 58 58 44 01 01 0F 01 01 02";
            
            
string footStr = "0A 2C 0E 16 04 02 08";
            
string midStr = string.Empty;
            
string myStr = string.Empty;
            
string last = string.Empty;
            
string  sentLenth = sendStr.Length.ToString("X");
            
if (sentLenth.Length<2)
            
{
                sentLenth 
="0"+sentLenth;
            }

            headStr 
+=" "+sentLenth;//第一部分

            midStr 
= BitConverter.ToString(ASCIIEncoding.Default.GetBytes(sendStr.Trim())).Replace("-", " ");
            
string HexStr = "44 01 01 0F 01 01 02"+" "+sentLenth+ " " + midStr + " " + footStr;
            last 
= getLast(HexStr);
            
//最终发送字节
            myStr = headStr.Trim() + " " + midStr.Trim() + " " + footStr.Trim()+" "+last;

            serialPort1.PortName 
= "COM1";  //端口号
            serialPort1.BaudRate = 9600;   //比特率
            serialPort1.Parity = Parity.None;//奇偶校验
            serialPort1.StopBits = StopBits.One;//停止位
            serialPort1.ReadTimeout = 1000; //读超时,即在1000内未读到数据就引起超时异常
            serialPort1.Open();
            
byte[] myByte = StringToByte(myStr.Trim());
            serialPort1.Write(myByte, 
0, myByte.Length);
            serialPort1.Close();
        
        }

       
/// <summary>
       
/// 测试
       
/// </summary>
       
/// <param name="type"></param>
       
/// <param name="speed"></param>
       
/// <param name="time"></param>
       
/// <param name="count"></param>
       
/// <returns></returns>

        private static string gettype(int type, int speed, int time, int count)
        
{
            
//出场方式
            string typeStr = "44 01 01 00 01 01 02";
            
switch (type)
            
{
                
case 0:
                    typeStr 
= "44 00 01 00 01 01 02";
                    
break;
                
case 1:
                    typeStr 
= "44 01 01 01 01 01 02";
                  
                    
break;
                
case 2:
                    typeStr 
= "44 02 01 02 01 01 02";
                    
break;
                
case 3:
                    typeStr 
= "44 03 01 03 01 01 02";
                    
break;
                
case 4:
                    typeStr 
= "44 04 01 04 01 01 02";
                    
break;
                
case 5:
                    typeStr 
= "44 05 01 05 01 01 02";
                    
break;
                
case 6:
                    typeStr 
= "44 06 01 06 01 01 02";
                    
break;
                
case 7:
                    typeStr 
= "44 07 01 07 01 01 02";
                    
break;

                
default:
                    typeStr 
= "44 01 01 00 01 01 02";
                     
break;
            }

            
return typeStr;
        }

        
//
        private static string get_head(int type, int speed, int time, int count)
        
{
           
// string headStr="44 01 01 00 01 01 02";
            string typeStr = " 01";
            
string speedStr = " 01";
            
string timeStr = " 00";
            
string countStr=" 01";

            
string headStr ="44"+typeStr+speedStr+timeStr+countStr+" 01 02";
            
//出场方式
            switch (type)
            
{
                
case 0:
                    typeStr 
= " 00";
                    
break;
                
case 1:
                    typeStr 
= " 01";

                    
break;
                
case 2:
                    typeStr 
= " 02";
                    
break;
                
case 3:
                    typeStr 
= " 03";
                    
break;
                
case 4:
                    typeStr 
= " 04";
                    
break;
                
case 5:
                    typeStr 
= " 05";
                    
break;
                
case 6:
                    typeStr 
= " 06";
                    
break;
                
case 7:
                    typeStr 
= " 07";
                    
break;

                
default:
                    typeStr 
=" 01";
                    
break;
            }

            
//移动速度
            switch (speed)
            
{
                
case 1:
                    speedStr 
= " 01";
                    
break;
                
case 2:
                    speedStr 
= " 02";
                    
break;
                
case 3:
                    speedStr 
= " 03";
                    
break;
                
case 4:
                    speedStr 
= " 04";
                    
break;
                
case 5:
                    speedStr 
= " 05";
                    
break;
                
case 6:
                    speedStr 
= " 06";
                    
break;
                
case 7:
                    speedStr 
= " 07";
                    
break;
                
case 8:
                    speedStr 
= " 08";
                    
break;
                
case 9:
                    speedStr 
= " 09";
                    
break;
                
case 10:
                    speedStr 
= " 0A";
                    
break;
                
case 11:
                    speedStr 
= " 0B";
                    
break;
                
case 12:
                    speedStr 
= " 0C";
                    
break;
                
case 13:
                    speedStr 
= " 0D";
                    
break;
                
case 14:
                    speedStr 
= " 0E";
                    
break;
                
case 15:
                    speedStr 
= " 0F";
                    
break;
              
                
default:
                    speedStr 
= " 01";
                    
break;
            }


            
//停留时间
            switch (time)
            
{
                
case 1:
                    timeStr 
= " 01";
                    
break;
                
case 2:
                    timeStr 
= " 02";
                    
break;
                
case 3:
                    timeStr 
= " 03";
                    
break;
                
case 4:
                    timeStr 
= " 04";
                    
break;
                
case 5:
                    timeStr 
= " 05";
                    
break;
                
case 6:
                    timeStr 
= " 06";
                    
break;
                
case 7:
                    timeStr 
= " 07";
                    
break;
                
case 8:
                    timeStr 
= " 08";
                    
break;
                
case 9:
                    timeStr 
= " 09";
                    
break;
                
case 10:
                    timeStr 
= " 0A";
                    
break;
                
case 11:
                    timeStr 
= " 0B";
                    
break;
                
case 12:
                    timeStr 
= " 0C";
                    
break;
                
case 13:
                    timeStr 
= " 0D";
                    
break;
                
case 14:
                    timeStr 
= " 0E";
                    
break;
                
case 15:
                    timeStr 
= " 0F";
                    
break;

                
default:
                    timeStr 
= " 01";
                    
break;
            }

           headStr 
="44"+typeStr+speedStr+timeStr+countStr+" 01 02";
           
return headStr;
        
        }

        
/// <summary>
        
/// 发送数据含(方式)
        
/// </summary>
        
/// <param name="sendStr">发送的字符串,注意前后不得有空格</param>
        
/// <param name="type">出场方式</param>
        
/// <param name="speed">移动速度</param>
        
/// <param name="time">停留时间</param>

        public void writeCom_type(string sendStr,int type, int speed, int time)
        
{

            
string headStr = "23 14 24 15 13 18 58 58 58 58 58 58";
            
string typeStr = get_head(type, speed, time, 0);
            
string footStr = "0A 2C 0E 16 04 02 08";
            
string midStr = string.Empty;
            
string myStr = string.Empty;
            
string last = string.Empty;
            
string sentLenth = sendStr.Length.ToString("X");
            
if (sentLenth.Length < 2)
            
{
                sentLenth 
= "0" + sentLenth;
            }

            
//最终headstr值
            headStr=headStr+" "+typeStr+" " + sentLenth;//第一部分

            midStr 
= BitConverter.ToString(ASCIIEncoding.Default.GetBytes(sendStr.Trim())).Replace("-", " ");
            
string HexStr = typeStr + " " + sentLenth + " " + midStr + " " + footStr;
            last 
= getLast(HexStr);
            
//最终发送字节
            myStr = headStr.Trim() + " " + midStr.Trim() + " " + footStr.Trim() + " " + last;

            serialPort1.PortName 
= "COM1";  //端口号
            serialPort1.BaudRate = 9600;   //比特率
            serialPort1.Parity = Parity.None;//奇偶校验
            serialPort1.StopBits = StopBits.One;//停止位
            serialPort1.ReadTimeout = 1000; //读超时,即在1000内未读到数据就引起超时异常
            serialPort1.Open();
            
byte[] myByte = StringToByte(myStr.Trim());
            serialPort1.Write(myByte, 
0, myByte.Length);
            serialPort1.Close();

        }

       
/// <summary>
       
/// 字符数组转字符串16进制
       
/// </summary>
       
/// <param name="InBytes"></param>
        
/// <returns>类似"01 02 0F"</returns>

        private static string ByteToString(byte[] InBytes)
        
{
            
string StringOut = "";
            
foreach (byte InByte in InBytes)
            
{
                StringOut 
= StringOut + String.Format("{0:X2}", InByte) + " ";
            }


            
return StringOut.Trim();
        }

       
/// <summary>
       
/// strhex 转字节数组
       
/// </summary>
        
/// <param name="InString">类似"01 02 0F"</param>
       
/// <returns></returns>

        private static byte[] StringToByte(string InString)
        
{
            
string[] ByteStrings;
            ByteStrings 
= InString.Split(" ".ToCharArray());
            
byte[] ByteOut;
            ByteOut 
= new byte[ByteStrings.Length];
            
for (int i = 0; i <= ByteStrings.Length - 1; i++)
            
{
                ByteOut[i] 
= byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);
            }

            
return ByteOut;
        }

        
/// <summary>
        
/// 计算最后一个字节
        
/// </summary>
        
/// <param name="hexString">类似"01 02 0F"</param>
        
/// <returns>十六进制和去除高位溢出</returns>

        private static string getLast(string hexString)
        
{
            
string hexValues = "44 01 01 00 01 04 C4 E3 BA C3 B0 A1 A3 A1 26 39 0E 16 04 02 08";

            
string[] hexValuesSplit = hexString.Split(' ');
            
int temp = 0;
            
foreach (String hex in hexValuesSplit)
            
{
                
// Convert the number expressed in base-16 to an integer.
                int value = Convert.ToInt32(hex, 16);
                
// Get the character corresponding to the integral value.
                string stringValue = Char.ConvertFromUtf32(value);
                
char charValue = (char)value;
                
//Console.WriteLine("hexadecimal value = {0}, int value = {1}, char value = {2} or {3}", hex, value, stringValue, charValue);
                temp += value;
            }

            
string tempStr = temp.ToString("x");
            
return tempStr.Remove(0, tempStr.Length - 2).ToUpper();
            
//return tempStr.Substring(tempStr.Length-2, tempStr.Length - 1).ToUpper();
        }

    }

}

在发送6个字屏使用
利用CSerialPort 类进行通信串口 示例代码: 打开串口 CSerialPort m_Port; //CSerialPort类对象 if (m_Port.InitPort(this, m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512)) { m_Port.StartMonitoring(); m_ctrlIconOpenoff.SetIcon(m_hIconRed); strStatus.Format("STATUS: 阅读详情

相关推荐

MFC之CSerialPort类双串口发送接收

MFC之CSerialPort类双串口发送接收 1、 基本框架 添加CSerialPort(.c、.h)文件添加到相应位置。 创建对象和函数 CSerialPort m_SerialPort1, m_SerialPort2; afx_msg LONG CDoublePortDlg::OnComm(WPARAM ch, LPARAM port);//此函数接收到一个字符执行一次 指

文森特 4761

串口发送不同类型数据方法

模拟串口数据传递 (参考了一些网友的思路,在此表示感谢~) 需要注意的是: 对于无符号数来说,左移和右移都是用的逻辑移位,即左移低位空出的补0,右移高位空出的补0; 对于有符号数来说,用的是算术移位,左移多出的会移进符号位,右移在gcc编译器下是算术右移,即空出的高位补符号位。 详细可参考此处:C语言 有符号数和无符号数的移位运算 #include<stdi...

且听风吟的博客 1万+

C#串口通信详解与工具类封装

在C#中实现串口通信通常使用类,这是.NET Framework提供的一个非常方便的方式来处理串行通信。

j_smilet的博客 1901

C++类:通过电脑串口发送数据到单片机

书写了一个C++串口发送数据类,可以发送单字节数据以及数据包,并简要说明了单片机利用串口数据包通信的方法。

lsxhhh的博客 3358

串口发送文件

自己写的一个示例程序,功能有: 1:串口功能:打开关闭串口; 2:选择文件功能; 3:发送文件功能; 4:取消发送功能; 5:取余计算功能; 6:窗口置顶功能; 7:打开网页功能; 调试时间不是很久,如果哪位发现BUG,欢迎到我的博客指正! http://blog.youkuaiyun.com/qq_23992597/article/details/51732691

Carla-编译CarlaUE4提示HoloLens.Automation项目缺少Windows程序集?

编译CarlaUE4提示HoloLens.Automation项目缺少Windows程序集?不妨看看这个!

DSK_981029的博客 2573

串口QSerialPort类同步与异步接收和发送数据及常见问题解决

QT作为C++的库,也是一样的道理。通讯的一方(B)如果不能及时处理串口数据,会设置自己的RTS为低电平,B的RTS连着对方(A)的CTS,A发现自己的CTS为低电平,将停止发送数据;因此每个bit紧接着下个bit,不存在额外的间隔,不管是起始bit,数据bit,奇偶bit,停止bit。通讯的双方A和B,假如A给B发送数据时,B反应过慢,A不管不顾的不停发送数据,结果会导致数据丢失。电脑串口以及一般使用的开发板串口都是默认8个数据bit,一个停止bit,(起始1bit是必须的)默认无奇偶校验位,无流控。

m0_73482095的博客 4139

今天出一个candence 17.4 allego的安装教程

7、安装完成,接下来进行补丁更新,找到Hotfix_SPB17.40.035_wint.iso软件 ,右击鼠标选择装载。6、因为之前选择的定制安装,这一步不知道具体要安装啥,因此都勾选,点击NECK,接下来等待安装完成。后面经过仔细对比,发现是前面更新补丁时选择了F盘,F盘是candence安装包,不是补丁。8、在破戒大师里选择安装更新补丁,并找到刚才装载的安装包里的程序,点击下一步。3、打开破戒大师,找到安装candence进行如下图选择,点击下一步。有耐心的人可以重新卸了再装一边,我就不卸了,直接装。

hcvinh的博客 2726

<QT学习>串口QSerialPort类同步与异步接收和发送数据,以及 for foreach forever的区别

<QT学习>串口QSerialPort类同步与异步接收和发送数据

u012719076的博客 2049

RT-Thread与LWIP协议栈在GD32F450XX上的移植实战:从FreeRTOS到RT-Thread的切换指南

本文详细介绍了将LWIP协议栈从FreeRTOS移植到RT-Thread系统,并在GD32F450XX开发板上实现的完整实战指南。重点解析了sys_arch适配层、邮箱与信号量接口的关键改造,以及网络驱动ethernetif.c的适配步骤,帮助开发者解决线程通信差异,实现稳定网络连接。

linux6sysadmin的博客 824

NXP KW45开发实战:如何在MCUXpresso IDE中正确配置J-Link并解决设备识别问题

本文详细介绍了在MCUXpresso IDE中配置J-Link以支持NXP KW45无线MCU开发的实战指南。从环境准备到J-Link深度配置,再到烧录流程优化和高级调试技巧,帮助开发者高效解决设备识别问题并提升开发效率。特别推荐使用JLinkRemoteServer.exe进行多设备并行调试,并提供了烧录速度优化和低功耗调试的实用技巧。

gray5的博客 864

python串口使用教程_Python Serial串口基本操作(收发数据)

1、需要模块以及测试工具模块名:pyserial使用命令下载:python -m pip install pyserial串口调试工具:sscom5.13.1.exe2、导入模块import serial3、打开串口直接通过new一个Serial()的实例即可打开返回实例# encoding=utf-8import serialif __name__ == "__main__":com = ser...

weixin_30873333的博客 2163

LLVM 编译器学习笔记之三十六-- 指令调度Instruction scheduling

1、参考Instruction scheduling in LLVM - 知乎,在中后端均存在指令调度 指令调度模型 2、在llvm12->llvm14 中Machine Instruction Scheduler有个patch增强了load/store指令的合并,也就是指令调度不仅仅只是改变指令的顺序,该优化类似gcc中的store-merge优化 .....................................................................

~ 飞 扬 的 天 空 ~ 5688

C# 串口收发的 类

//下面是新建的类 using System; using System.Collections.Generic; using System.Text; using System.IO.Ports; using System.Windows.Forms; namespace ComTest {     public class myComC     {         publ

jilong17的专栏 1530

WorkBuddy Skill赋能HYSYS与Comsol:AI工作台下的仿真自动化实践

AI Agent正将工业软件自动化带向新高度。在工程仿真领域,流程模拟与多物理场分析常因重复性操作而效率低下,Aspen HYSYS的批量工况调整、Comsol的参数扫描与网格重构均属此类。WorkBuddy这类AI工作台通过Skill将软件二次开发能力封装为可插拔技能包,利用HYSYS的COM/OLE接口和Comsol的Java API,实现自然语言指令到自动化执行的转变。其技术价值在于降低自动化门槛、沉淀工程经验,并支持日志审计与异常重试。在实际应用中,无论化工流程的灵敏度分析,还是激光焊接、移动网格等

weixin_29055699的博客 298

PCL Trimmed ICP实现点云精配准【2025最新版】

博客长期更新,本文最新更新时间为:2025年6月25日。抄袭狗记得来抄最新代码哦,抄都抄成错的,不够丢人钱。

点云侠的博客 37万+

QT5串口编程——编写简单的上位机

文章目录1.添加库,添加类一、设置和打开串口二、读取数据三、发送数据四、关闭串口1、创建一个新的Widgets Appliaction工程2、使用QtCreator的ui文件来设计上位机的界面,设计如下:3、mainwindow.h文件内容如下:4、mainwindow.cpp文件内容如下:5、main.cpp文件内容如下:6、测试结果仿:1.创建QT的mianwindow工程2.对原作者的界面进...

王强的博客 6万+

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力 (以YOLO26最新目标检测模型为基础,融合Detect_LSCD检测头进行改进)

2502_91881744的博客 703

java读写串口数据

最近接触到了串口及其读写,在此记录java进行串口读写的过程。 1.导入支持java串口通信的jar包: 在maven项目的pom.xml中添加RXTXcomm的依赖 或者 下载RXTXcomm.jar并导入到项目中。 支持Java串口通信操作的jar包,java.comm比较老,而且不支持64位系统,推荐使用Rxtx这个jar包(32位/64位均支持)。 下载地址: http://files.cnblogs.com/files/Dreamer-1/mfz-rxtx-2.2-20081207-wi

weixin_42359392的博客 3637

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Qt|串口通信之同步数据 发送数据并等待返回值

qt串口通信

编程改变世界。想做一些改变世界的产品。感谢一键三连。 6076

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Qt之串口收发数据

参考:http://blog.youkuaiyun.com/u014695839/article/details/50611549 参考:http://blog.youkuaiyun.com/zbw1185/article/details/51496663 通过好几天的学习,终于写出了一个用于串口通信的上位机。下面开始介绍串口类的使用。 首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添...

ZONGXP的博客 5万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

QT串口收发

status false 不可选 true 可选//清空comboBox。

qq_53031334的博客 9489

window下OpenCV通过串口发送数据(c++代码)

window下OpenCV通过串口发送数据(c++代码) 在window下面使用串口来发送数据是个比较头疼的问题,如果是在Linux下面可以使用系统本身自带一些api来发送数据,但是在window下面如果只是使用c++代码的话就需要使用微软的window.h,而且特别麻烦,我在网上找到了一个CSerialPort类,可以比较方便的使用串口发送数据。我的OpenCV是3.41版本的,64位。下面的代码是针对视觉巡线实验,通过OpenCV检测到目标进行处理,然后将得到的数据发送给下位机,我使用的下位机是stm3

sharpzhen的博客 3062
上一篇: 读取txt.sql
下一篇: 串口发送数据类
palm_java
博客等级 码龄20年 20粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值