【问题标题】:AT commands exchange with /dev/tty*AT 命令与 /dev/tty* 交换
【发布时间】:2019-07-04 06:47:08
【问题描述】:

我有一个板载 GPRS 的设备。 GPRS 与第三方应用程序连接并且可以正常工作。我需要知道连接的信号强度,所以,我使用 ATZ,然后使用 AT+CSQ 命令。当我使用某些终端软件工作时,它可以工作。然后,我尝试使用https://github.com/ishuah/bifrostsoft 作为终端。它也有效。但是我怎样才能简单地与设备通信,不使用终端,不重新连接或连接中止等?

我只是简单地尝试了echo ATZ > /dev/ttyX - 没有答案

    // This writes, but reads only zeros (((

    package main

    import (
        "github.com/jacobsa/go-serial/serial"
        "io"
        "log"
        "time"
        "fmt"
    )

    func Sleep(duration int) {
        time.Sleep(time.Second * time.Duration(duration))
    }

    func printBuf(b []byte){
        for _, val:=range b {
            fmt.Printf("%x ", val)
        }
    }


    func main(){

    options := serial.OpenOptions{
            PortName:              "/dev/ttyX",
            BaudRate:              115200,
            DataBits:              8,
            StopBits:              1,
            MinimumReadSize:       0,
            InterCharacterTimeout: 50,
        }

    port, err := serial.Open(options)
        if err != nil {
            log.Printf("port.Read: %v", err)
            return
        }

        // Make sure to close it later.
        defer port.Close()

    var s string  = `AT+CSQ`
    b:=[]byte(s)

    n, err := port.Write(b)
        if err != nil {
            log.Printf("port.Write: %v", err)
        }

    log.Println("Written bytes: ", n)

    //Sleep(1)

    res := make([]byte, 64)
        n, err = port.Read(res)
        if err != nil && err != io.EOF {
            log.Printf("port.Read: %v", err)
        }

    log.Println("READ bytes: ", n)


    printBuf(res)


    }

/*
I expect (for example):
---------
ATZ
OK
AT+CSQ
+CSQ 22.4
*/

【问题讨论】:

  • 你可以试试我的atinout 程序,它是专门为这样的用例编写的,例如echo AT+CSQ | atinout - /dev/ttyX -.

标签: linux go at-command modem


【解决方案1】:

大多数串行设备需要一个终止字符来响应它们收到的命令。

如果你添加它,你的代码应该可以工作:

var s string  = `AT+CSQ\r`

我看不出与您的代码和使用串行终端发送命令有任何其他区别。当您将命令直接回显到端口文件描述符时,同样适用。

【讨论】:

  • 答案出现了。但是有些“垃圾”,例如 f9 5 ef 21 7e ff 3 c0 d a 45 52 52 4f 52 d a f9 5 ef 0 2 7e ff 3 (命令为ATZ\r
  • 它应该是一个 NMEA 字符串或某种 GPS 坐标,对吧?也许你必须编码为 ASCII?
  • 这个“垃圾”是你的 printBuf 被明确编码产生的,所以我不太明白你的困惑。
  • 希望 this 能让您快速掌握这些数据。
  • 我已经用我的 GPS 模拟器测试了你的代码,它运行良好。如果要打印答案,则必须将其转换为字符串:log.Println(string(res))。如果您仍然看不到文字,那么您的端口可能设置错误(可能是波特率?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多