c - 通过串口将数据从 C 发送到 arduino 时,我应该进行任何转换吗?

标签 c linux sockets arduino linksys

我的设置:

Android 设备 =(WiFi)=> Linksys 路由器 (WRT54G) =(串口)=> Arduino

Android 设备:使用套接字 IO - 连接到路由器
Linksys 路由器:Linux 套接字 IO - 接受客户端
Arduino:从路由器串行读取数据。我已经在路由器上焊接了一个串口。

串行波特率为 9600,因此一切都是同步的。

问题:
我可以看到服务器将数据正确打印到控制台,但我在 Arduino 控制台中看到奇怪的字符。这是我所看到的:

从 Android 设备:向上

路由器控制台:

<Received : up

Arduino 控制台:

received: BELBELBELBELBELBELBELBELBELBELBELBELBELBELBEL up 
received: 

我不知道这个 BEL 角色来自哪里?

我的实验:
如果我从路由器控制台窗口执行此操作:

$> echo "hello" > /dev/tts/1

我在 Arduino 端获得了正确的数据,即我得到了:

received: hello
received:

我的代码:
路由器代码

int fd;
char *portname = "/dev/tts/1";

fd = open(portname, O_WRONLY);

if (fd < 0)
{
    printf("Error : cannot open port %s\n", portname);
    return -1;
}
...
    connfd = accept(listenfd, (struct sockaddr*)&serv_addr, &len);
    printf("accept OK!\n");
    printf("accepted connection from %s\n", inet_ntoa(serv_addr.sin_addr));

    char rcvbuf[MAX_BUFF_SIZE] = { '\0' };

    while(1)
    {
        int inData = recv(connfd, rcvbuf, sizeof(rcvbuf), 0);


        if (inData <= 0)
        {
         printf("Client closed!\n");
         break;
        }

        int result = write(fd, rcvbuf, strlen(rcvbuf));

        printf("<Received : %s\n", rcvbuf);

        // reset memory otherwise we will have data
        // from previous data
        bzero((char *)rcvbuff, sizeof(rcvbuf));
     }

...

Arduino 代码:

// the loop routine runs over and over again forever:
void loop() {

        while (Serial.available() > 0)
        {
          char inChar = (char)Serial.read();

          if (inChar == '\n' || inChar == '\r' || inChar == '\n\r' || inChar == '\r\n')
          {
            DATA_READ = true;
            break;
          }

          inputString += inChar;          
        }        
        // send data only when you receive data:
        if (DATA_READ) 
        {
          if (inputString[0] != ' ' || inputString[0] != '\n')
          {
            Serial.print("received: ");
            Serial.println(inputString + " " + inputString[0]);

            process_message(inputString[0]);

            // prepare for next round
            DATA_READ = false;

            Serial.flush();
            inputString = "";
          }
        }        
}

任何*指针将不胜感激:)

编辑
添加波特率以获取更多信息: 路由器

root@OpenWrt:/usr/bin# stty -F/dev/tts/1 -a
速度9600波特;行0;列 0;行=0; intr = ^C;退出=^\;删除= ^?;杀死=^U; eof = ^D;停产 = ; 尾数2 = ;开关=;开始=^Q;停止=^S;暂停=^Z; rprnt = ^R; 韦拉塞 = ^W;下一个 = ^V;齐平=^O;分钟= 1;时间=0;

Arduino:

  Serial.begin(9600);

  delay(50);

最佳答案

当您使用Android应用程序发送数据时,您确定从路由器写入arduino的数据中有换行吗?我不确定这些是否是导致您的错误的原因,但我建议:

  1. 在 android(或服务器)中添加“\n”。
  2. 如果您希望 arduino 中使用 ascii 字符,请确保 android 应用程序(java?)正在发送 ascii 字符。
  3. 写入服务器时使用int inData作为长度。检查其长度是否有意义。
  4. 检查 int result 是否有错误,并与 inData 进行比较

关于c - 通过串口将数据从 C 发送到 arduino 时,我应该进行任何转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288939/

相关文章:

c - 如何测量 C 中的时间间隔?

c - 如何找到任何PC的端口号?

c# - 处理套接字/完成两次的问题?

c - 跟踪日期并允许菜单选择的银行系统

c++ - 如何将字符转换为整数

linux - accept_local 不起作用

android - 如何以简单的方式将 shell 脚本输出重定向到 Logcat

linux - 如何将一个文件的尾部与另一个文件的头部结合起来?

mysql - 无法通过套接字 '/var/lib/mysql/mysql.sock' 连接到本地 MySQL 服务器 (2)

c - 使用 openCV 检测序列号