问一个关于 serialPort的

exception92 2016-01-05 02:49:50
问题是这样的:
我通过设置好了serialPort的各种参数,通过串口工具 发送命令给打印机,打印机可以很好的执行。是以16进制发送的数据。

在程序中(通过把16进制字符串转成16进制数组)的发送方式,发送的命令居然 直接打印了出来
比如:发送1B 4A 10 在串口工具中和程序 完全不同的效果。 路过的给点意见或者建议,看看我是不是漏写什么东西了?
感谢感谢。
...全文
347 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2016-01-06
  • 打赏
  • 举报
回复
你下载一个 "pccom"的软件(好像是这个名字 我忘记了) 前段时间用过.. 这个东西 可以抓串口的数据 类似Fiddler的样子. 你先用串口调试工具 抓下数据.. 保存下来,. 然后你在写 在抓 对比下 就知道了. 这样绝对是可以的..因为我当初在没有协议的情况下要读取硬件数据 我也只能通过抓的方式来采集他软件本身的发送出去的数据.
  • 打赏
  • 举报
回复
你上面改成:byte[] sendvalue = new byte[]{ "0x1B", "0x4A", "10" }; 看看
  • 打赏
  • 举报
回复
引用 16 楼 wyqlxy 的回复:
你上面改成:byte[] sendvalue = new byte[]{ "0x1B", "0x4A", "10" }; 看看
写错了,应为: byte[] sendvalue = new byte[] { 0x1B, 0x4A, 10 };
  • 打赏
  • 举报
回复
我T5看到这个帖子压力好大
Poopaye 2016-01-05
  • 打赏
  • 举报
回复
我觉得你可以试试用这玩意儿看看你发出去的数据究竟是什么 http://download.csdn.net/download/mqx521/1533347
xdashewan 2016-01-05
  • 打赏
  • 举报
回复
引用 12 楼 duanzi_peng 的回复:
是不是和加不加 0x 有关系呀
应该不是,你发送的最终是byte,0x只是16进制表现形式,只要你转换后的byte数组数据正确,之前的容器集合都不重要了。我的意思你搞个接受工具,分别接受串口工具给你发的和你自己给你自己发的,看看两者区别
exception92 2016-01-05
  • 打赏
  • 举报
回复
引用 10 楼 diaodiaop 的回复:
串口工具 你选没选那个16进制发送啊....
绝对选的了。
引用 11 楼 xdashewan 的回复:
有没串口接收工具,看看你发的和他给你工具发的是否一致
串口工具测试的是可以的。 是不是和加不加 0x 有关系呀
xdashewan 2016-01-05
  • 打赏
  • 举报
回复
有没串口接收工具,看看你发的和他给你工具发的是否一致
by_封爱 版主 2016-01-05
  • 打赏
  • 举报
回复
串口工具 你选没选那个16进制发送啊....
本拉灯 2016-01-05
  • 打赏
  • 举报
回复
先确定串口调试工具,就是我们平常用的COM工具,而不是用厂家自带的,直接发命令可不可以。 下面这一大堆的东西你就不要自己设了,用默认的就可以了。 serialPort.Encoding = Encoding.ASCII; serialPort.Parity = parity;//奇偶校验位 serialPort.DataBits = dataBits;//标准数据位长度 serialPort.StopBits = stopBits;//每个字节的标准停止位数 serialPort.ReadTimeout = readTimeout;//获取或设置读取操作未完成时发生超时之前的毫秒数 serialPort.WriteTimeout = writeTimeout;//获取或设置写入操作未完成时发生超时之前的毫秒数 serialPort.Handshake = Handshake.XOnXOff;
Poopaye 2016-01-05
  • 打赏
  • 举报
回复
打印机的话难道不是应该先发送些特定的控制命令再打印的么?
  • 打赏
  • 举报
回复
试着将你的byte[]数组顺序颠倒下传递过去呢
exception92 2016-01-05
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
就按你的例子,1B 4A 10你在测试工具里面应该是怎么样子的,然后那个工具是厂商提供的吗?
测试工具里 就是 这个样子。 是厂商提供的。不过实在是没有找到它的API。 我用Serial Port Utility工具 测试 也正常。
  • 打赏
  • 举报
回复
就按你的例子,1B 4A 10你在测试工具里面应该是怎么样子的,然后那个工具是厂商提供的吗?
exception92 2016-01-05
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
版主就是不一样,300分
我一般不问问题,除非实在是没招了。
exception92 2016-01-05
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
没code你说个啥

  public class ComHelper
    {
        /// <summary>初始化串行端口</summary>
        private SerialPort serialPort;
        public delegate void SerialPortDataReceivedDelegate(object sender, SerialDataReceivedEventArgs e);
        #region 函数
        /// <summary>
        /// COM口通信构造函数
        /// </summary>
        /// <param name="PortID">通信端口</param>
        /// <param name="baudRate">波特率</param>
        /// <param name="parity">奇偶校验位</param>
        /// <param name="dataBits">标准数据位长度</param>
        /// <param name="stopBits">每个字节的标准停止位数</param>
        /// <param name="readTimeout">获取或设置读取操作未完成时发生超时之前的毫秒数</param>
        /// <param name="writeTimeout">获取或设置写入操作未完成时发生超时之前的毫秒数</param>
        public ComHelper(int PortID, int baudRate, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One, int readTimeout = 100, int writeTimeout = 100)
        {
            try
            {
                serialPort = new SerialPort();
                serialPort.PortName = "COM" + PortID;//通信端口
                serialPort.BaudRate = baudRate;//波特率
                serialPort.Encoding = Encoding.ASCII;
                serialPort.Parity = parity;//奇偶校验位
                serialPort.DataBits = dataBits;//标准数据位长度
                serialPort.StopBits = stopBits;//每个字节的标准停止位数
                serialPort.ReadTimeout = readTimeout;//获取或设置读取操作未完成时发生超时之前的毫秒数
                serialPort.WriteTimeout = writeTimeout;//获取或设置写入操作未完成时发生超时之前的毫秒数
                serialPort.Handshake = Handshake.XOnXOff;
                //serialPort.ReceivedBytesThreshold = 8;  // 设置事件发生前 缓冲区中的字节数
            }
            catch (Exception ex) { throw new Exception(ex.Message); }
        }

        /// <summary>
        /// 打开COM口
        /// </summary>
        /// <returns>true 打开成功;false 打开失败;</returns>
        public void Open()
        {
            if (serialPort.IsOpen == false)
            {
                serialPort.Open();
            }
        }

        /// <summary>
        /// 关闭COM口
        /// </summary>
        /// <returns>true 关闭成功;false 关闭失败;</returns>
        public void Close()
        {
            if (serialPort.IsOpen)
                serialPort.Close();

        }

        /// <summary>
        /// 判断端口是否打开
        /// </summary>
        /// <returns></returns>
        public bool IsOpen() { return serialPort.IsOpen; }

        /// <summary>
        /// 向COM接口发送信息
        /// </summary>
        public void WriteData(string sendCommand)
        {
            try
            {
                if (IsOpen())
                {
                    // 测试数据
                    byte[] sendvalue = HexStringToBinary(new List<string>() { "0x1B", "0x4A", "10" }).ToArray();
                    serialPort.Write(sendvalue, 0, sendvalue.Length);
                }
                else { throw new Exception("端口打开失败!"); }
            }
            catch { throw; }
            finally
            {
            }
        }

        public void AddReceiveEventHanlder(SerialPortDataReceivedDelegate serialPort_DataReceived)
        {
            try
            {
                serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
            }
            catch { throw; }
        }
        /// <summary>
        /// 接收来自COM的信息
        /// </summary>
        /// <returns>返回收到信息的数组</returns>
        public List<string> ReceiveDataList()
        {
            try
            {
                if (!serialPort.IsOpen) return null;
                int DataLength = serialPort.BytesToRead;
                byte[] ds = new byte[DataLength];
                int bytecount = serialPort.Read(ds, 0, DataLength);
                return ByteToList(ds);
            }
            catch { throw; }
        }
        #endregion

        #region 解析函数
        /// <summary>
        /// 将16进制字符串转换成16进制字节数组
        /// </summary>
        /// <param name="hexstring"></param>
        /// <returns></returns>
        private List<byte> HexStringToBinary(List<string> hexstring)
        {
            try
            {
                List<byte> binary = new List<byte>();
                foreach (string hex in hexstring)
                {
                    binary.Add(Convert.ToByte(hex.Trim(), 16));
                }
                return binary;
            }
            catch { throw; }
        }

        /// <summary>
        /// 把字节型转换成十六进制字符串
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        private List<string> ByteToList(byte[] bytes)
        {
            try
            {
                List<string> list = new List<string>();
                foreach (byte byt in bytes)
                {
                    list.Add(String.Format("{0:X2} ", byt).Trim());
                }
                return list;
            }
            catch { throw; }
        }
        #endregion

    }
Poopaye 2016-01-05
  • 打赏
  • 举报
回复
版主就是不一样,300分
  • 打赏
  • 举报
回复
没code你说个啥

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧