首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >串口问题

串口问题
EN

Stack Overflow用户
提问于 2018-10-24 09:20:42
回答 1查看 187关注 0票数 0

我使用的硬件工作2波特率,我可以设置这个波特率与我的rs 232命令。

问题是我不想手动设置波特率,我希望软件设置一个波特率并发送一个命令,如果我得到一个答案,继续这个波特率,或者将它更改为第二个波特率并发送一个命令,如果回答了,继续这个波特率。

步骤:

  1. 开放端口,波特率- 38400
  2. 发送命令-如果收到答复,则没有更改。
  3. 如果没有应答,则关闭端口
  4. 开放端口,波特率- 9600
  5. 发送命令-如果接收到的应答继续使用此波特率
  6. 如果没有回答错误消息

我编写了一个代码,但是命令没有发送到硬件,如果我给Thread.sleep(),那么我的接口就会冻结。我怎样才能做到这一点?

以下是我的代码:

代码语言:javascript
运行
复制
if (!SCP.IsOpen) {
            SCP.PortName = cBoxComPort.Text;
            SCP.BaudRate = 38400;
            SCP.Parity = Parity.None;
            SCP.DataBits = 8;
            SCP.StopBits = StopBits.One;

            SCP.DataReceived += SerialPort1DataReceived;

            SCP.ReceivedBytesThreshold = 1;

            SCP.Open();

            dataout = "get rs232";    // test command 
            SCP.Write(dataout + "\r");
            progressBar1.Value = 100;


            fnLogFile = new StreamWriter("Logfile_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".log", true);
            //string valueofdatain = datain;


            string stringvalue = "command syntax error at cursor position 000";


            if (stringvalue.CompareTo(datain) == 0 ) {
            SCP.Close();
            fnLogFile.Close();


                SCP.PortName = cBoxComPort.Text;
                SCP.BaudRate = 9600;
                SCP.Parity = Parity.Even;
                SCP.DataBits = 8;
                SCP.StopBits = StopBits.One;
                SCP.Open();
                SCP.DataReceived += SerialPort1DataReceived;
                SCP.ReceivedBytesThreshold = 1;

                dataout = "get rs232";
                SCP.Write(dataout + "\r");
                progressBar1.Value = 100;

                fnLogFile = new StreamWriter("Logfile_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".log", true);

        } else {
            SCP.Close();
            fnLogFile.Close();
            progressBar1.Value = 0;
        }

}

EN

回答 1

Stack Overflow用户

发布于 2018-10-24 18:26:53

DataReceived事件的代码在哪里?你需要一个状态机来完成你想要做的事情。请看this link,我写了一篇很好的文章,介绍了如何做到这一点。

你基本上会在38400发送命令1,如果你得到一个响应,很好,移动到你的下一个状态,在那里你做你需要做的。否则,如果您没有得到响应,超时,将波特率设置为9600并返回命令1状态(请注意,您可以在端口打开时切换波特率,我相信)。

使用链接中的示例,下面是添加超时的方法:

Stopwatch sw = new Stopwatch();

代码语言:javascript
运行
复制
case StateMachine.SendCmd1:
    sw.Reset();
    sw.Start();

    CallbackResponse = Cmd1Response;    //set our delegate to the first response
    sp.Write("Send first command1");    //send our command through the serial port

    currentState = StateMachine.Cmd1Response;   //change to cmd1 response state
    break;
case StateMachine.Cmd1Response:
    //waiting for a response....you can put a timeout here
    if (sw.ElapsedMilliseconds > (5000) && sw.ElapsedMilliseconds != 0)
    {
        //set the baud rate
        //set current state back to SendCmd1
    }
    break;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52965347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档