首页 > 编程语言 >C#实现扫码枪串口通信

C#实现扫码枪串口通信

时间:2024-09-17 18:34:37浏览次数:12  
标签:System 扫码 Log C# Text Enabled cmb SerialPort 串口

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class frm_SerianTest : Form
    {
        /// <summary>
        /// frm_SerianTest构造函数
        /// </summary>
        public frm_SerianTest()
        {
            InitializeComponent();//部件初始化
        }

        private SerialPort SerialPort_0 = new SerialPort();//实例化串口设备
        //private Encoding Encoding_0 = Encoding.Default;//选用默认编码模式

        /// <summary>
        /// 定时器事件:实现系统时间获取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            //实现系统时间显示
            Lbl_SysTime.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
        }

        /// <summary>
        /// 窗口加载事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frm_SerianTest_Load(object sender, EventArgs e)
        {
           
            timer1.Interval = 1000;//时间间隔1000 单位:ms
            timer1.Start();//启用间隔时间事件
            timer1.Tick += timer1_Tick;
          
            //获取可用端口号
            string[] Ports = SerialPort.GetPortNames();
            if (Ports.Length>0)//获取数组长度大于0
            {
                cmb_Port.DataSource = Ports;//获取到的端口号赋值给Cmb_Port
            }

            //波特率设置
            int[] Bauds = { 1200, 2400, 4800, 9600, 12800, 115200 };
            cmb_BaudRate.DataSource = Bauds;
            cmb_BaudRate.SelectedIndex = 3;//开机默认9600

            //校验位设置(typeof:可以取得变量的类型,或者表达式的类型)
            cmb_ParityBit.DataSource = Enum.GetNames(typeof(Parity));//获取Parity枚举的各名称;

            //数据位设置
            int[] DataBits = { 5, 6, 7, 8 };
            cmb_DateBit.DataSource = DataBits;
            cmb_DateBit.SelectedIndex = 3;

            //停止位设置
            cmb_StopBit.DataSource = Enum.GetNames(typeof(StopBits));//获取Parity枚举的各名称;
            cmb_StopBit.SelectedIndex = 1;



        }
        /// <summary>
        /// 刷新可用端口事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Refresh_Click(object sender, EventArgs e)
        {
            string[] Ports = SerialPort.GetPortNames();//获取电脑中可用的端口
            if (Ports.Length > 0)
            {
                cmb_Port.DataSource = Ports;
            }
        }

        /// <summary>
        /// 与虚拟串口设备建立连接事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_ConnectReader_Click(object sender, EventArgs e)
        {
            if (btn_ConnectReader.Text == "连接")
            {
                if (SerialPort_0.IsOpen)//如果已经建立连接则先断开
                {
                    SerialPort_0.Close();
                }

                try //(*Trim()是去空格*)
                {
                    SerialPort_0.PortName = cmb_Port.Text.Trim();
                    SerialPort_0.BaudRate = Convert.ToInt32(cmb_BaudRate.Text.Trim());
                    SerialPort_0.DataBits = Convert.ToInt32(cmb_DateBit.Text.Trim());
                    SerialPort_0.Parity = (Parity)Enum.Parse(typeof(Parity), cmb_ParityBit.Text.Trim(), true);//将comboBox中的字符串转换为Parity枚举类型
                    SerialPort_0.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmb_StopBit.Text.Trim(), true);//将comboBox中的字符串转换为StopBits枚举类型
                    SerialPort_0.Encoding = Encoding.Default;//选用默认编码方式
                    SerialPort_0.ReceivedBytesThreshold = 1;//默认缓存区为1个字节
                    SerialPort_0.DataReceived += SerialPort_0_DataReceived;
                    SerialPort_0.Open();//打开连接

                    //MessageBox.Show("连接成功");
                    Log("连接成功!" );

                    //禁用众多通信参数配置选项
                    btn_Refresh.Enabled = false;
                    btn_ConnectReader.Text = "断开";
                    cmb_Port.Enabled = false;
                    cmb_BaudRate.Enabled = false;
                    cmb_DateBit.Enabled = false;
                    cmb_StopBit.Enabled = false;
                    cmb_ParityBit.Enabled = false;
                }
                catch (Exception ex)
                {

                    //MessageBox.Show("连接失败"+ex.Message);
                    Log("连接失败!" + ex.Message);
                }

            }
            else if (btn_ConnectReader.Text == "断开")
            {
                SerialPort_0.Close();
                //MessageBox.Show("断开成功");
                Log("已断开!");

                //启用通信参数配置项
                btn_Refresh.Enabled = true;
                btn_ConnectReader.Text = "连接";
                cmb_Port.Enabled = true;
                cmb_BaudRate.Enabled = true;
                cmb_DateBit.Enabled = true;
                cmb_StopBit.Enabled = true;
                cmb_ParityBit.Enabled = true;
            }




            
        }

        private void SerialPort_0_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                //因为要访问UI资源,所以需要使用invoke方式同步ui
                this.Invoke((EventHandler)(delegate
                {
                    string result = string.Empty;
                    result = SerialPort_0.ReadExisting();
                    Log("扫码结果:" + result);
                })
                );

            }
            catch (Exception ex)
            {
                //响铃并显示异常给用户
                //System.Media.SystemSounds.Beep.Play();
                Log(ex.Message);
            }
        }
      
        //通过ListView将信息显示
        private void Log(string info)
        {
            Invoke(new Action(() =>
            {
                string time = DateTime.Now.ToString();
                ListViewItem Lst = new ListViewItem(time);
                Lst.SubItems.Add(info);
                listView1.Items.Insert(0, Lst);
            }));


        }

        private void btn_ManulCode_Click(object sender, EventArgs e)
        {
            if (tbox_ManulCode.Text==string.Empty)
            {
                Log("条码信息不能为空!");         
            }
            else
            {
                Log("手动输入条码结果:" + tbox_ManulCode.Text);
                tbox_ManulCode.Text = "";
            }
        }

        private void btn_Send_Click(object sender, EventArgs e)
        {
            if (SerialPort_0.IsOpen)
            {
                if (tbox_SendData.Text != string.Empty)
                {
                    try
                    {
                        SerialPort_0.Write(tbox_SendData.Text.Trim());
                    }
                    catch (Exception ex)
                    {

                        Log("发送失败," + ex);
                    }
                    
                    Log("发送内容:" + tbox_SendData.Text);
                }
                else
                {
                    Log("没有发送内容!");
                }

            }
            else
            {
                Log("串口未打开!");
            }
        }


    }
}

 

标签:System,扫码,Log,C#,Text,Enabled,cmb,SerialPort,串口
From: https://www.cnblogs.com/csflyw/p/18417377

相关文章

  • linux驱动开发-内核并发 poll 和 lock
    内核并发poll加lock执行流程用户空间进程调用write将数据写入设备:执行char_write,更新event_triggered并唤醒等待的进程。有进程因此等待:正在执行的char_read会检查event_triggered,如果为0,执行等待。数据可用时:事件被触发(event_triggered被设为1),之前因等待而被......
  • which products are best-selling and which are slow-moving, so as to adjust procu
    SKUstandsforStockKeepingUnit. Specifically: I.Intheretailindustry 1. Representingspecificproducts:Foraspecificproduct,eachdifferentcombinationofattributes(suchascolor,size,style,etc.)isusuallyregardedasanindependen......
  • STM32智能小车--测距模块(舵机+HC_SR04超声波)
    大家好哇!我是湫湫,一个正在摸索嵌入式的普通大学生。进入正题,最近在做智能小车,想通过文章记录学习过程。本次文章主要使用 stm32F1C8T6实现小车测距。非常感谢大家的阅读,如果有不对的地方欢迎指正。目录一.实物图1.舵机2.HC_SR04:二.基本工作原理1.舵机工作原理2.......
  • 信息学奥赛初赛天天练-91-CSP-S2023基础题3-编译命令、树的重心、拓扑排序、进制转换
    PDF文档公众号回复关键字:202409172023CSP-S选择题1单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)11以下哪个命令,能将一个名为main.cpp的C++源文件,编译并生成一个名为main的可执行文件?()Ag++-omainmain.cppBg++-omain.cppmainCg++......
  • CL260 学习笔记(一)
    RHCA课程须知Ceph原理及架构......
  • 详解IPC(进程间通信)
    进程间通信(IPC,Inter-ProcessCommunication)是指在不同进程之间传递数据或信号的机制。由于进程之间的地址空间是独立的,IPC提供了一种在进程之间进行数据交换的方法。以下是几种常见的IPC机制:1.管道(Pipes)匿名管道匿名管道是单向的通信通道,通常用于具有亲缘关系的进程之间(如......
  • 安装docker-compose
    1. 在Linux上安装DockerCompose步骤1:下载DockerCompose二进制文件首先,您需要下载DockerCompose的二进制文件。您可以使用以下命令来下载最新版本的 docker-composesudocurl-L"https://github.com/docker/compose/releases/latest/download/docker-compose-$(unam......
  • Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
    0前言在页面中,要实现数据更新的视图实时显示,纯JavaScrip需要手动编写代码来处理数据和视图之间的更新。而Vue提供了数据绑定的能力,使得数据和视图保持同步。我们通过一个实例来体验两者的差别。我们设计一个页面,在页面里提供一个文本框,用户可以在文本框输入内容,然后我们在文本框下......
  • 打卡信奥刷题(771)用Scratch图形化工具信P5727[普及组/提高组] 【深基5.例3】冰雹猜想
    【深基5.例3】冰雹猜想题目描述给出一个正整数nnn,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘3......
  • SwiftUI里的ForEach使用的注意事项
    在用Swift编程语言的SwiftUI包设计苹果设备的程序时,经常会用到ForEach函数。这个函数的作用是将一个数据集里面的内容一条一条地取出,罗列在程序的页面上,使用方式的详解见[1]。但ForEach和一般的循环不同之处在于它要求输入里面的数据集里元素必须是Identifiable的,否则不可使用......