【问题标题】:serial communication reset /etc/profile (linux)串行通信重置 /etc/profile (linux)
【发布时间】:2015-04-29 00:57:41
【问题描述】:

我正在研究 pc (ubuntu) 和嵌入式 linux (2.6.24) 板之间的串行通信。串行通信本身似乎可以工作(我使用来自http://serialib.free.fr/html/index.html 的Serialib)但是每次我在板上的应用程序停止收听/etc/profile 文件时都会被板调用(对于不使用的应用程序不会发生这种情况)串行)。

要知道,当我在板上启动应用程序时,我在 PC 上打开了一个 gtkterm 来跟踪板子的终端(也使用串行端口),我认为这是罪魁祸首重置 /etc/profile 但我不确定。

我的阅读应用程序代码

#include <stdio.h>
#include "serialib.h"
#include <QCoreApplication>
#include <QSettings>
#include <QProcess>
#include <iostream>

#if defined (_WIN32) || defined( _WIN64)
#define         DEVICE_PORT             "COM1"                               // COM1 for windows
#endif

#ifdef __linux__
#define         DEVICE_PORT             "/dev/ttyS0"                         // ttyS0 for linux
#endif

int main()
{
    serialib LS;                                                            // Object of the serialib class
int Ret,res;                                                                // Used for return values
char Buffer[128];

// Open serial port

Ret=LS.Open(DEVICE_PORT,115200);                                        // Open serial link at 115200 bauds
if (Ret!=1) {                                                           // If an error occured...
    printf ("Error while opening port. Permission problem ?\n");        // ... display a message ...
    return Ret;                                                         // ... quit the application
}
printf ("Serial port opened successfully !\n");

// Read a string from the serial device
Ret=LS.ReadString(Buffer,'\n',128,5000);                                // Read a maximum of 128 characters with a timeout of 5 seconds
                                                                        // The final character of the string must be a line feed ('\n')
if (Ret>0)                                                              // If a string has been read from, print the string
    printf ("String read from serial port : %s",Buffer);  
else
    printf ("TimeOut reached. No data received !\n");                   // If not, print a message.

// Close the connection with the device

LS.Close();

return 0;
}

我在超时限制内向串口发送“TEXT\n”,并且在 gtkterm 的终端副本上出现“从串口读取的字符串:TEXT”,然后是“正在运行的 etc/profile”。就像我之前说过的,我怀疑我在发送字符串的同时使用带有 gtkterm 的串行,但我必须让它工作才能使用板,我希望你对这个问题发表意见。

感谢您以后的回答。

【问题讨论】:

    标签: c linux serialization


    【解决方案1】:

    您已将系统配置为在同一串行端口上运行另一个程序(login 或其亲属)。

    检查/inittab。确保没有使用该端口启动 logingetty 的实例。 (您仍然希望它在另一个串行端口上运行,即您用于终端会话的那个)

    【讨论】:

    • 我似乎没有在该端口上运行程序,我的 inittab 看起来像这样: ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh tty2 ::askfirst:-/bin/sh tty3::askfirst:-/bin/sh tty4::askfirst:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/ bin/umount -a -r ::shutdown:/sbin/swapoff -a
    • @Wowy:是在你的 Ubuntu 开发盒还是目标系统上?
    • @Wowy:如果你在调用LS.Close()之前先睡一觉,什么时候会出现关于/etc/profile的额外行?我怀疑它是由关闭端口触发的。
    • 当在调用 LS.Close() 之前休眠(例如 sleep(5))时,有关 /etc/profile 的行会出现在休眠之后(这里是 5 秒)。我尝试删除 LS.Close() 行,但即便如此 /etc/profile 在阅读后仍会被调用。如果我不在目标上运行应用程序但仍然在串行上发送一个字符串,我可以看到我发送的串行“TEST”出现在目标和 /etc 的终端上(就像我将手动输入的命令) /profile 没有被调用。但这不让我有可能使用目标上的字符串。
    • @Wowy:等等,你有一个用于终端的串行端口和一个用于字符串数据的串行端口吗?或者你想用一个端口来做这两个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2014-04-12
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多