串口

55 阅读2分钟

CMD

send_tex:
	mode COM2: baud=9600 data=8 stop=1 parity=n		::串口相关参数
	echo "hello,com" > COM2			::发送文本
	echo hello > COM2			::发送文本
	
send_file:
	mode COM2: baud=9600 data=8 stop=1 parity=n	::串口相关参数
	copy file.txt COM2				::发送文件
	
rec_file:
	type COM2: > rec_file.txt	::需手动结束,将接收到的消息、文本内容,都写入rec_file.txt

传输文件

c# 接收示例

using System.IO.Ports;
using System.Text;

namespace ComTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            SerialPort serialPort = new SerialPort()
            {
                PortName = "COM2",
                BaudRate = 9600,
                Parity = Parity.None,
                DataBits = 8,
                StopBits = StopBits.One,
            };
            try
            {
                byte[] bs = new byte[1024];
                serialPort.Open();
                while (serialPort.IsOpen)
                {
                    int v = serialPort.Read(bs, 0, 1024);
                    if (serialPort.BytesToRead == 0)
                        break;
                    Thread.Sleep(100);
                }
                //string msg=Encoding.GetEncoding("gb2312").GetString(bs);
                string msg = Encoding.UTF8.GetString(bs);
                Console.WriteLine(msg);
            }
            catch { }
        }
    }
}

读写分离:

using System.IO.Ports;
using System.Text;

namespace ComTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            SerialPort serialPort = new SerialPort()
            {
                PortName = "COM2",
                BaudRate = 4800,
                Parity = Parity.None,
                DataBits = 8,
                StopBits = StopBits.One,
            };
            try
            {
                List<Task> tasks = new List<Task>();
                byte[] bs = new byte[1024];
                serialPort.Open();
                var t1 = Task.Run(() =>
                    {
                    R:
                        while (serialPort.IsOpen)
                        {
                            int v = serialPort.Read(bs, 0, 1024);
                            if (serialPort.BytesToRead == 0)
                                break;
                            Thread.Sleep(100);
                        }
                        //string msg=Encoding.GetEncoding("gb2312").GetString(bs);
                        string msg = Encoding.UTF8.GetString(bs);
                        Console.WriteLine(msg);
                        goto R;
                    });
                tasks.Add(t1);

                var t2 = Task.Run(() =>
                {
                    while (serialPort.IsOpen)
                    {
                        serialPort.Write("hello msg");
                        Thread.Sleep(3000);
                    }
                });

                tasks.Add(t2);

                Task.WaitAll(tasks.ToArray());
                serialPort.Close();

            }
            catch { }
        }
    }
}

大文件发送:

using System.IO.Ports;
using System.Text;

namespace ComTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            SerialPort serialPort = new SerialPort()
            {
                PortName = "COM2",
                BaudRate = 9600,
                Parity = Parity.None,
                DataBits = 8,
                StopBits = StopBits.One,
            };
            try
            {
                List<Task> tasks = new List<Task>();
                byte[] bs = new byte[4096];
                serialPort.Open();
                var t1 = Task.Run(() =>
                    {
                    R:
                        while (serialPort.IsOpen)
                        {
                            int v = serialPort.Read(bs, 0, 1024);
                            if (serialPort.BytesToRead == 0)
                                break;
                            Thread.Sleep(100);
                        }
                        //string msg=Encoding.GetEncoding("gb2312").GetString(bs);
                        string msg = Encoding.UTF8.GetString(bs);
                        Console.WriteLine(msg);
                        goto R;
                    });
                tasks.Add(t1);

                var t2 = Task.Run(() =>
                {
                    //while (serialPort.IsOpen)
                    //{
                    //    serialPort.Write("hello msg");
                    //    Thread.Sleep(3000);
                    //}
                    Thread.Sleep(10000);
                    string msg = File.ReadAllText("send.txt");
                    //拆为200份,分割的文件要小于 传输限制
                    var msgs = SplitStringIntoParts(msg, 200);

                    msgs.ForEach(m =>
                    {
                        if (serialPort.IsOpen)
                        {
                            serialPort.Write(m);
                            Thread.Sleep(100);
                        }
                        Console.WriteLine("send file end");
                    });
                });

                tasks.Add(t2);

                Task.WaitAll(tasks.ToArray());
                serialPort.Close();

            }
            catch { }
        }

        static List<string> SplitStringIntoParts(string input, int partsCount)
        {
            List<string> parts = new List<string>();
            int totalLength = input.Length;
            int partLength = totalLength / partsCount;
            int remainder = totalLength % partsCount;

            int startIndex = 0;

            for (int i = 0; i < partsCount; i++)
            {
                int currentPartLength = partLength + (i < remainder ? 1 : 0); // 处理余数
                string part = input.Substring(startIndex, currentPartLength);
                parts.Add(part);
                startIndex += currentPartLength;

                // 如果拆分的部分到达结尾,则退出
                if (startIndex >= totalLength)
                    break;
            }

            return parts;
        }
    }
}

DNC 在线加工

博客

FANUC | FANUC在线加工方法介绍 | 数控驿站