導航:首頁 > 編程語言 > linux串口編程

linux串口編程

發布時間:2022-01-15 00:37:22

Ⅰ 關於linux下多串口編程

或許 是 硬體資源 的 問題
串口 相關的 中斷、IO 地址等等

Ⅱ 如何在LINUX下編寫一個C語言的串口程序

1、參考這個:POSIX操作系統串口編程指南和 UNIX環境高級編程。
2、簡單介紹一下:
《POSIX操作系統的串口編程指南》是在UNIX環境或PC上對串口進行編程的教程,每一章提供的常式都使用POSIX(Portable Standard for UNIX)終端控制函數,只需極少的修改就可運行在IRIX 、HP-UX、 SunOS、 Solaris、 Digital UNIX、 Linux等大多數類UNIX操作系統。

Ⅲ linux下怎樣對串口編程

使用串口協議登錄Linux終端控制台,通過Zmodem文件傳輸協議接收一個外部文件。 命令:rz -y 會彈出文件瀏覽窗口,選擇要上傳的文件即可。 -y 表示若文件已存在,則覆蓋。

Ⅳ linux下的串口編程

這有個友善的串口常式,參考下吧,用gcc編譯可以在linux下用
# include <stdio.h>
# include <stdlib.h>
# include <termio.h>
# include <unistd.h>
# include <fcntl.h>
# include <getopt.h>
# include <time.h>
# include <errno.h>
# include <string.h>

int CommFd, TtyFd;

static void Error(const char *Msg)
{
fprintf (stderr, "%s\n", Msg);
fprintf (stderr, "strerror() is %s\n", strerror(errno));
exit(1);
}
static void Warning(const char *Msg)
{
fprintf (stderr, "Warning: %s\n", Msg);
}

static int SerialSpeed(const char *SpeedString)
{
int SpeedNumber = atoi(SpeedString);
# define TestSpeed(Speed) if (SpeedNumber == Speed) return B##Speed
TestSpeed(1200);
TestSpeed(2400);
TestSpeed(4800);
TestSpeed(9600);
TestSpeed(19200);
TestSpeed(38400);
TestSpeed(57600);
TestSpeed(115200);
TestSpeed(230400);
Error("Bad speed");
return -1;
}

static void PrintUsage(void)
{

fprintf(stderr, "comtest - interactive program of comm port\n");
fprintf(stderr, "press [ESC] 3 times to quit\n\n");

fprintf(stderr, "Usage: comtest [-d device] [-t tty] [-s speed] [-7] [-c] [-x] [-o] [-h]\n");
fprintf(stderr, " -7 7 bit\n");
fprintf(stderr, " -x hex mode\n");
fprintf(stderr, " -o output to stdout too\n");
fprintf(stderr, " -c stdout output use color\n");
fprintf(stderr, " -h print this help\n");
exit(-1);
}

static inline void WaitFdWriteable(int Fd)
{
fd_set WriteSetFD;
FD_ZERO(&WriteSetFD);
FD_SET(Fd, &WriteSetFD);
if (select(Fd + 1, NULL, &WriteSetFD, NULL, NULL) < 0) {
Error(strerror(errno));
}

}

int sendUart(char c)
{
WaitFdWriteable(CommFd);
return write(CommFd, &c, 1);
}

char recUart()
{
char c='\0';
if (FD_ISSET(CommFd, &ReadSetFD))
{
if(read(CommFd, &c, 1) == 1) return c;
else printf("No data to receive.\n");
}
}

int main(int argc, char **argv)
{
struct termios TtyAttr;
struct termios BackupTtyAttr;

int DeviceSpeed = B115200;
int TtySpeed = B115200;
int ByteBits = CS8;
const char *DeviceName = "/dev/ttyS0";
const char *TtyName = "/dev/tty";
int OutputHex = 0;
int OutputToStdout = 0;
int UseColor = 0;

printf("Now we start.\n");
opterr = 0;
for (;;) {
int c = getopt(argc, argv, "d:s:t:7xoch");
if (c == -1)
break;
switch(c) {
case 'd':
DeviceName = optarg;
break;
case 't':
TtyName = optarg;
break;
case 's':
if (optarg[0] == 'd') {
DeviceSpeed = SerialSpeed(optarg + 1);
} else if (optarg[0] == 't') {
TtySpeed = SerialSpeed(optarg + 1);
} else
TtySpeed = DeviceSpeed = SerialSpeed(optarg);
break;
case 'o':
OutputToStdout = 1;
break;
case '7':
ByteBits = CS7;
break;
case 'x':
OutputHex = 1;
break;
case 'c':
UseColor = 1;
break;
case '?':
case 'h':
default:
PrintUsage();
}
}
if (optind != argc)
PrintUsage();

CommFd = open(DeviceName, O_RDWR, 0);
if (CommFd < 0)
Error("Unable to open device");
if (fcntl(CommFd, F_SETFL, O_NONBLOCK) < 0)
Error("Unable set to NONBLOCK mode");

memset(&TtyAttr, 0, sizeof(struct termios));
TtyAttr.c_iflag = IGNPAR;
TtyAttr.c_cflag = DeviceSpeed | HUPCL | ByteBits | CREAD | CLOCAL;
TtyAttr.c_cc[VMIN] = 1;

if (tcsetattr(CommFd, TCSANOW, &TtyAttr) < 0)
Warning("Unable to set comm port");

TtyFd = open(TtyName, O_RDWR | O_NDELAY, 0);
if (TtyFd < 0)
Error("Unable to open tty");

TtyAttr.c_cflag = TtySpeed | HUPCL | ByteBits | CREAD | CLOCAL;
if (tcgetattr(TtyFd, &BackupTtyAttr) < 0)
Error("Unable to get tty");

if (tcsetattr(TtyFd, TCSANOW, &TtyAttr) < 0)
Error("Unable to set tty");

for (;;) {
unsigned char Char = 0;
fd_set ReadSetFD;

void OutputStdChar(FILE *File) {
char Buffer[10];
int Len = sprintf(Buffer, OutputHex ? "%.2X " : "%c", Char);
fwrite(Buffer, 1, Len, File);
}

FD_ZERO(&ReadSetFD);

FD_SET(CommFd, &ReadSetFD);
FD_SET( TtyFd, &ReadSetFD);
# define max(x,y) ( ((x) >= (y)) ? (x) : (y) )
if (select(max(CommFd, TtyFd) + 1, &ReadSetFD, NULL, NULL, NULL) < 0) {
Error(strerror(errno));
}
# undef max

if (FD_ISSET(CommFd, &ReadSetFD)) {
while (read(CommFd, &Char, 1) == 1) {

WaitFdWriteable(TtyFd);
if (write(TtyFd, &Char, 1) < 0) {
Error(strerror(errno));
}
if (OutputToStdout) {
if (UseColor)
fwrite("\x1b[01;34m", 1, 8, stdout);
OutputStdChar(stdout);
if (UseColor)
fwrite("\x1b[00m", 1, 8, stdout);
fflush(stdout);
}
}
}

if (FD_ISSET(TtyFd, &ReadSetFD)) {
while (read(TtyFd, &Char, 1) == 1) {
static int EscKeyCount = 0;
WaitFdWriteable(CommFd);
if (write(CommFd, &Char, 1) < 0) {
Error(strerror(errno));
}
if (OutputToStdout) {
if (UseColor)
fwrite("\x1b[01;31m", 1, 8, stderr);
OutputStdChar(stderr);
if (UseColor)
fwrite("\x1b[00m", 1, 8, stderr);
fflush(stderr);
}

if (Char == '\x1b') {
EscKeyCount ++;
if (EscKeyCount >= 3)
goto ExitLabel;
} else
EscKeyCount = 0;
}
}

}

ExitLabel:
if (tcsetattr(TtyFd, TCSANOW, &BackupTtyAttr) < 0)
Error("Unable to set tty");

return 0;
}

Ⅳ linux下串口編程 打開串口的fd為什麼為

可靠的方法是用串口線對接兩台電腦, 監視電腦打開終端軟體, 設置顯示16進制數. 這樣在監視電腦上就可以看到對端傳過來的東西了, 並且也可以用鍵盤回送信息.

Ⅵ linux 串口編程亂碼

關於串口設備,最好聯系廠家詢問是否提供API介面。

關於API介面一般是一個可供調用的DLL文件。

如果有可以直接在C#中引用,作為類庫來操作設備。

具體調用方式需要詢問廠家或參閱api的文檔說明。

不提供軟體介面的設備是無法進行開發的。

我大概搜了下這個設備,設備是提供配套軟體的,那麼這款設備是有相關通訊介面類庫的,也就是可以用C#進行開發。
如果找不到API文檔,
請嘗試用串口調試工具,跟蹤配套軟體的每一步操作,獲取串口通訊報文,用C#模擬操作報文自己封裝通訊類後進行開發。

Ⅶ Linux RS485串口編程

對於編程來說,沒什麼區別,通過控制485的使能端該程序完全可以使用。唯一的區別就是你在發送的時候通過程序把485的控制腳拉高,接收的時候把他拉低就可以了。至於電氣方面的區別:RS232是全雙工,可以同時收發,RS485是半雙工,不能同時收發,還有電平信號不一樣,這個編程你就不要理了。

Ⅷ linux文件編程和串口編程的基本概念是什麼

簡單說幾句吧,linux下的設備都是文件,流程也無非是open, read/write, close等當然,串口你得設置各種屬性才行對不對,比如在win下的超級終端就設置了波特率啊,停止位啊,奇偶校驗啊什麼的,這些屬性都通過 int tcgetattr(int fd, struct termios *termios_p); int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);函數來設置。完整代碼嗎自己去google,一把一把的,其實最重要的是設置好屬性,剩下的就是read,write的問題咯。希望對你有用對了,了解終端函數的詳情請在linux命令行終端獲取: man termios

閱讀全文

與linux串口編程相關的資料

熱點內容
php圖庫系統 瀏覽:972
python科學計算pdf第二版 瀏覽:3
ac3演算法 瀏覽:33
玩吧app的貓在哪裡買 瀏覽:384
app的aes加密 瀏覽:662
前端可以引入python腳本嗎 瀏覽:260
單片機中斷的原理 瀏覽:892
php開源架構 瀏覽:578
最好聽的解壓聲控 瀏覽:259
mdb2php 瀏覽:34
安卓怎麼修改ini文件夾 瀏覽:926
機構投資的創新之路pdf 瀏覽:683
如何用路由器訪問公司伺服器 瀏覽:526
dosrd命令 瀏覽:678
玩子君手作解壓丸子 瀏覽:252
php上傳php文件出錯 瀏覽:688
群暉盤陣建ftp子文件夾 瀏覽:546
天空都市伺服器地址 瀏覽:433
c游戲編程入門教程pdf 瀏覽:672
php框架安全 瀏覽:715