.net 串口操作学习记录

举报
Amrf 发表于 2019/10/24 20:04:45 2019/10/24
【摘要】 由于既没有实际串口也没有虚拟串口,上面的代码都没有进行实际测试,改进空间应该还比较巨大;首先需要一个单例:private static MSerialPort _instance = null;private static Object _mutex = new Object();public static MSerialPort GetInstance(int ComPortNum) { ...

由于既没有实际串口也没有虚拟串口,上面的代码都没有进行实际测试,改进空间应该还比较巨大;


首先需要一个单例:

private static MSerialPort _instance = null;
private static Object _mutex = new Object();
public static MSerialPort GetInstance(int ComPortNum) {
    if (_instance == null)
    {
        lock (_mutex) // now I can claim some form of thread safety...
        {
            if (_instance == null)
            {
                _instance = new MSerialPort(ComPortNum);
            }
        }
    }
    return _instance;
}
private MSerialPort(int ComPortNum):base(){
    ...
}

异步写:

public async Task<bool> WriteStr(string value)
{
    if (!base.IsOpen) {
        if (!doConnect(_ComPortNum)) {
            return false;
        }
    }
    byte[] buffer = new byte[128];
    Encoding.UTF8.GetBytes(value, 0, value.Length, buffer, 0);
    bool flag = false;
    try
    {
        base.BaseStream.WriteTimeout = 2;
        await base.BaseStream.WriteAsync(buffer, 0, 128);
        flag = true;
    }
    catch (Exception ex)
    {
        Console.WriteLine("MSerialPort exception: " + ex);
    }
    return flag;
}

异步读一次:

public async Task<Tuple<bool,string>> readStr()//ref string value
{
    if (!base.IsOpen)
    {
        doConnect(_ComPortNum);
    }
    byte[] buffer = new byte[128];
    bool flag = false;
    try
    {
        base.BaseStream.ReadTimeout = 2;
        await base.BaseStream.ReadAsync(buffer, 0, 128);//这种一旦读到任何内容就结束
        flag = true;
    }
    catch (Exception ex)
    {
        Console.WriteLine("MSerialPort exception: " + ex);
    }
    return new Tuple<bool, string>(flag, System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length));
}

异步读到特征值:

public async Task<Tuple<bool, MatchCollection>> readUntil(Regex reg)//ref string value,
{
    Console.WriteLine("readUntil");
    if (!base.IsOpen)
    {
        doConnect(_ComPortNum);
    }
    DateTime beforDT = System.DateTime.Now;
    byte[] buffer = new byte[128];
    base.BaseStream.ReadTimeout = 2;
    double spend = 0;
    bool flag = false;
    StringBuilder sb = new StringBuilder();
    MatchCollection matchx = null;
    await Task.Run(() => {
        do
        {
            Array.Clear(buffer, 0, buffer.Length);
            try
            {
                base.BaseStream.Read(buffer, 0, 128);
            }catch(Exception ex)
            {
                //Console.WriteLine("MSerialPort exception: " + ex);
            }
            sb.Append(System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length));
            string value = sb.ToString();
            if(value != "")
            {
                matchx = reg.Matches(value);
                if (matchx.Count > 0)
                {
                    flag = true;
                    break;
                }
            }
            DateTime afterDT = System.DateTime.Now;
            TimeSpan ts = afterDT.Subtract(beforDT);
            spend = ts.TotalMilliseconds;
        } while (spend <= 5000.0);
    });
    return new Tuple<bool, MatchCollection>(flag, matchx);
}

测试调用:

单例:
static async void MyAsyncMethod()
{
    MSerialPort s = GetInstance(1);
    Task<bool> calculateResult = s.WriteStr("123");
    await calculateResult;
    Regex rx = new Regex(@"(\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
    Task<Tuple<bool, MatchCollection>> calculateResult1 = s.readUntil(rx);
    await calculateResult1;
}


看到这种建议:

Strongly recommend PInvokeSerialPort, it fires one event for every byte, and more stable than .net built in one ===>(一个c++串口的wrapper)

https://stackoverflow.com/questions/42568662/serial-port-on-c-read-until-a-byte-sequence

其他参考:

https://stackoverflow.com/questions/18716928/how-to-write-a-async-method-with-out-parameter

https://stackoverflow.com/questions/40686776/what-exactly-is-a-reference-in-c-sharp

https://www.tutorialspoint.com/csharp/csharp_reference_parameters.htm+&cd=16&hl=en&ct=clnk&gl=sg

https://stackoverflow.com/questions/11654562/how-to-convert-byte-array-to-string

https://msdn.microsoft.com/en-us/magazine/cc301786.aspx

https://www.codeproject.com/Questions/1060886/Continuosly-serial-port-read

https://blog.csdn.net/xzjxylophone/article/details/6832160

https://blog.csdn.net/u013658041/article/details/78203931

https://stackoverflow.com/questions/51658706/await-async-on-anonymous-function

https://stackoverflow.com/questions/20395826/explicitly-use-a-functask-for-asynchronous-lambda-function-when-action-overloa

https://stackoverflow.com/questions/1897555/what-is-the-equivalent-of-memset-in-c

https://stackoverflow.com/questions/1407715/how-to-quickly-zero-out-an-array/43188508

https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex?view=netframework-4.8

https://www.geeksforgeeks.org/destructors-in-c-sharp/+&cd=1&hl=en&ct=clnk&gl=sg

https://stackoverflow.com/questions/5732282/using-the-destructor-dispose-of-the-base-class

https://csharpindepth.com/articles/singleton+&cd=1&hl=en&ct=clnk&gl=sg

https://stackoverflow.com/questions/4203634/singleton-with-parameters

https://blogs.msdn.microsoft.com/benjaminperkins/2017/03/08/how-to-call-an-async-method-from-a-console-app-main-method/

https://stackoverflow.com/questions/24894774/how-to-use-await-within-main

https://recaffeinate.co/post/how-to-await-console-application/+&cd=4&hl=en&ct=clnk&gl=sg

https://github.com/ebraminio/PInvokeSerialPort

/*-------------------------C#有名管道-------------------------------------*/

https://docs.microsoft.com/en-us/dotnet/api/system.io.pipes.namedpipeclientstream?view=netframework-4.8

https://bytes.com/topic/c-sharp/answers/277259-readtoend-blocking+&cd=2&hl=en&ct=clnk&gl=sg

https://github.com/sovprene/named-pipe-examples/tree/master/Inter-Process%20Communication%20(IPC)/CSNamedPipeClient

https://www.codeproject.com/Articles/864679/Creating-a-Server-Using-Named-Pipes

https://gist.github.com/Suplanus/f652a15a55bff64b6ccb33836041f8bb

https://stackoverflow.com/questions/48059410/using-namedpipeserverstream-and-namedpipeclientstream-asynchronously

https://gist.github.com/AArnott/0d5f4645ad7e9a765cee

https://stackoverflow.com/questions/23304311/async-namedpipeclientstream-implementation-feedback

https://stackoverflow.com/questions/49838628/named-pipe-input-output-in-c-sharp


1.ReadToEnd阻塞的原因(https://bytes.com/topic/c-sharp/answers/277259-readtoend-blocking+&cd=2&hl=en&ct=clnk&gl=sg)

--No - there's no real sense of "all data" until the stream has been
closed, because the server could always have sent some more since you


2.WaitForPipeDrain();//等待管道另一端读取所有

/*-------------------------C#单元测试-------------------------------------*/

https://blog.csdn.net/lang791534167/article/details/50778246

https://docs.microsoft.com/en-us/visualstudio/test/walkthrough-creating-and-running-unit-tests-for-managed-code?view=vs-2019

/*-------------------------C#异步-------------------------------------*/

https://blog.csdn.net/madongchunqiu/article/details/69855744

https://blog.csdn.net/jl1134069094/article/details/50511418

https://blog.csdn.net/a_little_a_day/article/details/78519265

https://codeday.me/bug/20190223/699688.html

https://medium.com/software-development-2/coroutines-and-fibers-why-and-when-5798f08464fd+&cd=3&hl=en&ct=clnk&gl=sg

https://blog.csdn.net/lxrj2008/article/details/78677810

https://blog.csdn.net/wlk1229/article/details/81276970

https://stackoverflow.com/questions/5096926/what-is-the-get-set-syntax-in-c

/*-------------------------C#异步-------------------------------------*/

https://msdn.microsoft.com/en-us/magazine/cc164086.aspx

https://stackoverflow.com/questions/1949051/is-there-a-fiber-api-in-net

https://paoloseverini.wordpress.com/tag/fibers/+&cd=5&hl=zh-CN&ct=clnk&gl=sg

https://medium.com/%40deep_blue_day/long-story-short-async-await-best-practices-in-net-1f39d7d84050+&cd=7&hl=zh-CN&ct=clnk&gl=sg

https://blog.csdn.net/mawming/article/details/52385405

https://docs.microsoft.com/en-us/windows/win32/procthread/fibers

https://stackoverflow.com/questions/31221210/fibers-vs-async-await

https://www.zhihu.com/question/23955356

https://github.com/markpapadakis/coros-fibers

https://medium.com/software-development-2/coroutines-and-fibers-why-and-when-5798f08464fd+&cd=11&hl=zh-CN&ct=clnk&gl=sg



【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。