精华内容
下载资源
问答
  • 向串口发送数据

    2007-11-06 10:21:13
    写了一个向串口发送数据的Winform程序
  • 上篇文章讲述了electron和serialport的环境搭建,以及打包流程,实现了串口通信,本篇,继续上篇,讲述另一个操作,向串口发送数据,因为最近有个需求,需要收银系统,打通设备上的客显设备,于是有了本篇。...

    一、前言

    electron+node+node-serialport 实现串口通信+electron-builder打包完整流程

    上篇文章讲述了electron和serialport的环境搭建,以及打包流程,实现了串口通信,本篇,继续上篇,讲述另一个操作,向串口发送数据,因为最近有个需求,需要收银系统,打通设备上的客显设备,于是有了本篇。

    二、了解客显设备

    笔者开始也是一抹黑,不知道到底发送了什么给客显,LED上才会显示 找零 总价,数字等,我查了一个客显指令集

    上面的指令可以参考,但是我本身这台,我还是不知道,所以我下载了2个软件,一个是客显打印测试,用于向设备发送数据,这个是别人写好的,第二个我下载了一个拦截,监听串口的数据,我就能抓包到,到底发送了什么,一个是打印客显测试 ,一个是串口精灵 当然资源笔者已经上传了,

    资源地址

    总结:

    我最终得到的是,发送的是hex,就是16进制,然后是按一定指令的,所以,如果要开发,需要按以上步骤,抓取指令,

    参考:

    清屏 :0C,

    单价:ESCs1 , 总计 :ESCs2, 收款:ESCs3 找零:ESCs4

    数字前缀: 1B5141

    发送显示的价格,就是发送16进制的字符,但是有一个默认的前缀,(自己看抓包的数据)

    ASCLL码对照表

    三、开始操作

    操作很简单,主要用的是serialport.write()方法

    不过注意一点,就是写的时候,需要转换,为hex 的buffer对象,不然,你传输的数据会被当成ASCLL码,而不是16进制,可以通过对比你在串口中监听的数据来看

    index.html

    主要步骤,sendMessge方法,发送给node前,先把发送的字符串,转成16进制的字符串

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            #mess{text-align: center}
        </style>
    </head>
    <body>
        <div id="mess">正在连接...</div>
        <div id="socket">
          
        </div>
        <input type="text" id="inputMessage">
          <button onclick="sendMessge()">发送</button>
        <div>
          <button onclick="buttonChange(1)">总价</button>
          <button onclick="buttonChange(2)">找零</button>
          <button onclick="buttonChange(3)">清除</button>
        </div>
        <script>
    
            var arr = [
              {type:1,name:"总价",code:"1B7332"},
              {type:2,name:'找零',code:"1B7334"},
              {type:3,name:'清除',code:"0C"},
              {type:4,name:'输入',code:"1B5141"},
            ]
    
            var mess = document.getElementById("mess");
            var socket = document.getElementById("socket");
            var inputElement = document.getElementById("inputMessage");
    
    function buttonChange(type){
                  let code = ''
                  arr.map(item=>{
                    if(item.type==type){
                        code = item.code
                    }
                  })
                  ws.send(code)
              }
          
         
      
          function sendMessge(){
              //发送前先将字符,转成16进制的字符串,并拼接上前缀
            var str=''
            let c = inputElement.value
            for(var i=0;i<c.length;i++){
              str += c.charCodeAt(i).toString(16)
            }
            str = "1B5141" + str
            console.log(str); 
            ws.send(str);
          }
            if(window.WebSocket){
                var ws = new WebSocket('ws://127.0.0.1:27611');
    
              
                ws.onopen = function(e){
                    console.log("连接服务器成功");
                    ws.send("HeartBeat");
                }
                ws.onclose = function(e){
                    console.log("服务器关闭");
                }
                ws.onerror = function(){
                    console.log("连接出错");
                }
    
                ws.onmessage = function(e){
                  console.log(e.data);
                  socket.innerHTML ="获取到的数据"+ e.data
                  mess.innerHTML = "连接成功"
                  
                }
            }
        </script>
    </body>
    </html>
    
    

    main.js

    接受到前端的16进制的字符串,再通过 Buffer.from(),转换成hex的buffer对象,发送给串口

    const {
      app,
      BrowserWindow,
      Menu,
      MenuItem,
      globalShortcut
    } = require('electron')
    
    const SerialPort = require('serialport');
    
    const WebSocket = require('ws');
    
    // 引用Server类:
    const WebSocketServer = WebSocket.Server;
    
    
    var portName = 'COM2'; //定义串口名
    
    var serialPort;
    var strs = ''
    var wss
    var COMarr = []
    
    function getPortArr() {
      return new Promise((res, rej) => {
        // 检索带有元数据的可用串行端口列表
        SerialPort.list().then((ports) => {
          ports.forEach(function (port) {
            COMarr.push(port.comName)
            console.log(port.comName);
    
            console.log(port.pnpId);
    
            console.log(port.manufacturer);
            res()
          });
        });
      })
    }
    
    
    function startPort() {
      if (serialPort) {
        try {
          serialPort.close();
        } catch (err) {
    
        }
      }
      serialPort = new SerialPort( //设置串口属性
    
        portName, {
    
          baudRate: 2400, //波特率
    
          dataBits: 8, //数据位
    
          parity: 'none', //奇偶校验
    
          stopBits: 1, //停止位
    
          flowControl: false,
    
          autoOpen: false //不自动打开
    
        }, false);
    
    
      serialPort.on('error', (error) => {
        console.log('Error: ', error.message);
      })
      serialPort.open(function (error) {
    
        if (error) {
    
          console.log("打开端口" + portName + "错误:" + error);
    
        } else {
          if (wss) {
            wss.close()
          }
          // 实例化:
          wss = new WebSocketServer({
            port: 27611
          });
    
          wss.on('connection', function (ws) {
            console.log("开启连结")
            ws.on("message", function (message) {
             
              if (message === "HeartBeat") {
                ws.send('连接已打开')
                return
              }
              if(message){
                console.log('接受数据' + message);
                  //将已经转成16进制的字符串,转换成hex的buffer对象
                const c = Buffer.from(message,'hex')
                serialPort.write(c)
              }
            })
            ws.on("close", function () {
              console.log("关闭服务");
            })
          })
     
    
        }
    
      });
    
    
    
    }
    
    startPort()
    
    
    //获取对应的elctron版本和对应的node版本,
    // console.log("node:",process.versions.node)
    // console.log("electron:",process.versions.electron)
    // console.log("modules:",process.versions.modules)
    /**
     * 事件
     * 属性
     * 方法
     * **/
    // 创建一个窗口
    // 在主进程中.
    // 或者从渲染进程中使用 `remote`.
    // const { BrowserWindow } = require('electron').remote
    
    
    
    app.on('ready', () => {
      let win = new BrowserWindow({
        width: 1000,
        height: 800,
        title: "五不像收银系统",
        webPreferences: {
          nodeIntegration: true
        }
      })
      // 加载页面
       win.loadFile('./index.html')
      // 加载远程URL
      //win.loadURL('http://localhost:9528/#/login')
      // 类似浏览器的window 与窗口有关的浏览器内容都是通过下面的属性
      // win.webContents
      console.log(win.webContents, 1111);
      // 配置esc退出全屏
      globalShortcut.register('ESC', () => {
        console.log('ESC');
        win.setFullScreen(false);
      })
      console.log(globalShortcut.isRegistered('ESC'));
       clearTimeout(this.timer)
       this.timer = setTimeout(()=>{
      win.setFullScreen(true);
       },1000);
      //打开开发者工具
       win.webContents.openDevTools();
    
      getPortArr().then(() => {
    
        // 创建菜单对象
        let menu = new Menu();
        // 创建菜单项
        let submenu = []
        COMarr.map(item => {
          submenu.push({
    
            type: "normal",
            label: item,
            click() {
              portName = item
              strs = ''
              startPort()
            }
    
    
          })
          submenu.push({
            type: "separator", //菜单分割符
          }, )
        })
        let mil = new MenuItem({
          type: "submenu",
          label: '切换端口',
          submenu: submenu
         
        })
        let mil2 = new MenuItem({
    
          type: "submenu",
          label: '功能',
          submenu: [{
              role: "forcereload",
              label: "刷新",
    
            },
            {
              type: "separator", //菜单分割符
            },
    
            {
              role: "togglefullscreen",
              label: "全屏",
    
            },
            {
              type: "separator", //菜单分割符
            },
            {
              role: "minimize",
              label: "最小化",
    
            },
            {
              type: "separator", //菜单分割符
            },
               {
              label: '开发者工具',
            accelerator: (function() {
              if (process.platform == 'darwin')
                return 'Alt+Command+I';
              else
                return 'Ctrl+Shift+I';
            })(),
            click: function(item, focusedWindow) {
              if (focusedWindow)
                focusedWindow.toggleDevTools();
            }
            },
            {
              type: "separator", //菜单分割符
            },
            {
              role: "quit",
              label: "退出",
            },
          ]
        })
        //把菜单添加到指定的菜单对象
        menu.append(mil)
        menu.append(mil2)
        Menu.setApplicationMenu(menu)
    
      })
    
    })
    

    注意事项,如果连接没成功,请先切换端口,到正确的端口,然后刷新页面即可,具体操作,查看上一篇文章

    electron+node+node-serialport 实现串口通信+electron-builder打包完整流程

    展开全文
  • 查看串口,向串口发送数据

    千次阅读 2011-04-08 10:57:00
    打印串口输出:   cat /dev/ttyUSB0 cat /dev/ttyS0 等等。...     向串口发送数据:   echo 111 >/dev/ttyUSB0 echo 111 >/dev/ttyS0

    打印串口输出:

     

    cat /dev/ttyUSB0

    cat /dev/ttyS0

    等等。。。

     

     

    向串口发送数据:

     

    echo 111 >/dev/ttyUSB0

    echo 111 >/dev/ttyS0

    展开全文
  • C# 向串口发送数据

    热门讨论 2009-06-20 08:47:09
    使用C#编写的代码,开发环境为VS 2005
  • SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件。经过测试,可以正常使用(不...
    最近写C#串口通信程序,系统是B/S架构。SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件。经过测试,可以正常使用(不支持多线程调用)。 
    

        一、Machine类

        1、Machine类有一个静态变量,定义如下:

    private static SerialPort serialPort = null;

        2、向串口发送数据,同步接收返回数据的方法:

    /// <summary>
    /// 向串口发送数据,读取返回数据
    /// </summary>
    /// <param name="sendData">发送的数据</param>
    /// <returns>返回的数据</returns>
    private byte[] ReadPort(byte[] sendData)
    {
        if (serialPort == null)
        {
            serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
            serialPort.ReadBufferSize = 1024;
            serialPort.WriteBufferSize = 1024;
        }
    
        if (!serialPort.IsOpen)
        {
            serialPort.Open();
        }
    
        //发送数据
        serialPort.Write(sendData, 0, sendData.Length);
    
        //读取返回数据
        while (serialPort.BytesToRead == 0)
        {
            Thread.Sleep(1);
        }
        Thread.Sleep(50); //50毫秒内数据接收完毕,可根据实际情况调整
        byte[] recData = new byte[serialPort.BytesToRead];
        serialPort.Read(recData, 0, recData.Length);
    
        return recData;
    }

        3、发送联机指令:

    /// <summary>
    /// 联机
    /// </summary>
    /// <returns>联机成功或失败</returns>
    public bool Connect(out string msg)
    {
        byte[] sendData = new byte[] { 0x01, 0x01, 0x00, 0x00 };
        CommonUtil.CalCheckCode(sendData);
        byte[] recData = ReadPort(sendData);
    
        if (recData.Length >= 4
            && recData[0] == 0x01
            && recData[1] == 0x02
            && recData[2] == 0x00
            && CommonUtil.ValidCheckCode(recData))
        {
            switch (recData[3])
            {
                case 0x00:
                    msg = "控制主板正在重启";
                    return false;
                case 0x01:
                    msg = "联机成功";
                    return true;
                case 0x02:
                    msg = "控制主板正在维护";
                    return false;
                case 0x03:
                    msg = "控制主板收到的数据格式不正确";
                    return false;
                default:
                    msg = "未知状态";
                    return false;
            }
        }
        else
        {
            msg = "货机返回的数据格式不正确";
            return false;
        }
    }

        二、如何使用,这里是在C/S程序中测试,在B/S程序中也可以正常使用,下面是窗体Form1类中的代码:

        1、定义对象及初始化

    private Machine machine = null;
    
    public Form1()
    {
        InitializeComponent();
        machine = new Machine();
    }

        2、联机事件

    //联机
    private void btnConnect_Click(object sender, EventArgs e)
    {
        string msg = null;
        if (machine.Connect(out msg))
        {
            MessageBox.Show("成功:" + msg);
        }
        else
        {
            MessageBox.Show("失败:" + msg);
        }
    }
    展开全文
  • //主机血压板发送数据 void Set_Init_pressure_OnReceive(void); //血压板返回给主机数据 void Set_Init_pressure_OnClose(void); //关闭串口 private: int str[100]; DWORD dwErrorFlags; COMSTAT...
  • 向串口发送数据,并获得返回值

    万次阅读 热门讨论 2010-06-30 18:01:00
    java读取串口,以十六进制数据发送,获得时虽然工具上显示的也是十六进制,但其实是经过转化的,至于在转化之前是什么样子的,之前我还真不知道。但是这次,呵呵,不一样咯,搞定了,用代码读取时返回的是整型的,...

    实现要求:用java代码通过串口向电路板发送指令“aa00dd0000000055”,获得返回值“AA00DD03000055”【此处注意,没有FF】,经串口调试工具测试,硬件是好的。

    证明如下:

    此工具为串口调试工具,用VB编写的

     

     

    java实现其功能代码如下: 

     

     

    这段破代码搞了我很长时间,一直没有成功获取返回值,差点要了我的命。但是现在我的命保住了。呵呵。终于获得了正确的返回值。返回结果为:b=-86  b=0  b=-35 b=3  b=0  b=0  b=85  b=85。

    为了测试这段数字的十六进制形式是否跟上面的串口调试工具得到的结果一样,将这段数字转化为十六进制,代码如下:

    结果为:

    -86的十六进制:ffffffaa
    0的十六进制:0
    -35的十六进制:ffffffdd
    3的十六进制:3
    85的十六进制:55

    为了得到只有2位的表示形式,自己判断一下就行了,这里就不介绍了。

     

    PS:

    1:以前的程序错在没有写监听事件。

    2:以前的程序在获得返回值后将serialPort端口关闭了【这个其实我想不通为什么不能关闭,我觉得应该关闭】

    3:获得portId是不能使用简写,即portId = CommPortIdentifier.getPortIdentifier("COM3");这个是让人比较来火的,居然不能写成简写形式,NND,真晕!

     

     再PS一下:我还是喜欢我的代码,原因2个字“精简”!看网上的东西废话太多,让人郁闷。

    展开全文
  • c# 串口发送数据c# 串口发送数据c# 串口发送数据c# 串口发送数据
  • STM32串口发送数据和接收数据方式总结

    万次阅读 多人点赞 2018-05-13 20:34:22
    之前写了篇关于ESP8266使用AT指令进行互相通讯的实验,在写STM...串口发送数据: 1. 串口发送数据最直接的方式就是标准调用库函数。void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 第一个参数是发送...
  • MATLAB串口发送数据

    2021-01-12 19:05:12
    可以实时串口发送数据
  • 使用C语言串口发送数据,即串口写入数据。将要发送的数据写进一个数据,一次一次发送出去。
  • STM32F1向串口一直发送数据,学习串口通信的最好例子,实测通过,主要是用一块板子第二块板子发送数据,用了2种方法
  • linux串口发送数据

    热门讨论 2010-09-05 21:55:35
    linux串口数据,linux串口数据,linux串口数据
  • 51单片机 串口发送数据(只是发送)用于调试。 #include <reg51.h> #define uchar unsigned char #define uint unsigned int #define XTAL 11059200 // CUP 晶振频率 #define baudrate 9600 // 通信波特...
  • S 串口编程 详解4 串口发送数据

    千次阅读 2013-10-31 11:39:25
    S 串口编程 详解4 串口发送数据 串口发送数据包括: 十六进制发送数据 手动发送数据 自动发送数据 手动发送数据的代码如下: //手动发送 long TX_count=0; void CSCOMMDlg::OnButtonManualsend() { if...
  • STM32串口发送数据的标准函数

    千次阅读 2018-06-15 14:03:42
    STM32串口发送数据的标准函数 例子:1 void UART_Send_Message(u8 *Data,u8 lenth) { while(lenth--) { USART_SendData(USART2, *Data); ...
  • STM32串口发送数据

    万次阅读 2019-05-15 15:35:53
    串口通信经常作为开发调试的工具,所以先介绍下串口通信。 串口通讯(Serial Communication)...目前STM32一般只使用 RXD、TXD 以及 GND 三条信号线,直接传输数据信号。 STM32的串口通信外设有USART和UART。USART是...
  • 在Linux系统下实现读取文件内容,并使用串口发送。串口为RS232.
  • 在使用串口发送数据时可以选择字符串发送或者十六进制发送,通常情况下我们习惯选用字符串发送数据。关于两者的区别,需要从计算机存储数据的格式说起。  在计算机中,数据是以二进制的形式存储的,例如十进制 1...
  • python使用serial向串口发送接收数据

    千次阅读 2020-08-21 19:46:38
    # 接收错误需要设置串口详细 ser = serial.Serial('com3', 9600, parity='E', stopbits=1, bytesize=8, timeout=0.5) def com_read(): while True: rev_num = ser.inWaiting() data = b'' while rev_nu
  • 我是一个菜鸟,最近学习Java ,写了个向串口发送数据的代码,有点问题,希望各位大神给指点指点 ``` package server; import gnu.io.CommPortIdentifier; import gnu.io.PortInUseException; import gnu.io....
  • 串口发送数据和接收数据,在此作一个简单的Demo.此Demo可以实现按下硬件按钮,灯亮,发送灯状态数据过来。并且可以实现几个灯同时亮,发送灯的状态数据过来。PC端实现点击按钮让硬件灯亮。 此处为4个灯,发送过来...
  • 单片机串口发送数据

    万次阅读 多人点赞 2015-09-30 20:35:25
    很少看到有资料写如何以中断的方式发送一帧数据,如果以等待的发送数据帧,对高速运行的单片机来说是很浪费时间的,下面就介绍一种使用中断方式发送数据帧,操作平台采用51 mcu
  • 串口是STM32最为重要的资源,在平时的硬件调试和软件调试中都是不可或缺的工具,最近在测试一块板子的通信功能是否正常,我打算用板子A的串口USART1一直向串口发送数据,用板子B的串口1接收数据,并将接收到的数据...
  • 基于c51单片机的数据采集串口发送数据到pc的C程序
  • 基于STM32F103 处理器的串口发送数据程序,使用输入输出重定向,在程序中可以使用 printf scanf
  • 之前写了篇关于ESP8266使用AT指令进行互相...串口发送数据: 1. 串口发送数据最直接的方式就是标准调用库函数。void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 第一个参数是发送的串口号,第二个参数...
  • python 实现串口发送数据

    万次阅读 2019-07-19 11:04:35
    功能: 发送指定AT命令到设备 实现关机 ''' import serialser def poweroffSchedule(): ser=serial.Serial("COM5",115200,timeout=0.5) ser.write('AT+POWER_OFF\r\n'.encode()) print(ser.readline()); ser....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,631
精华内容 34,252
关键字:

向串口发送数据