導航:首頁 > 操作系統 > linuxechoe

linuxechoe

發布時間:2023-03-19 00:15:56

A. 在linux系統下怎麼讀取串口伺服器的實時數據

Linux串口讀寫:
#include <stdio.h> /*標准輸入輸出定義*/
#include <stdlib.h> /*標准函數庫定義*/
#include <unistd.h> /*Unix 標准函數定義*/
#include <sys/types.h>
#include <sys/stat.h>
#include "string.h"
#include <fcntl.h> /*文件控制定義*/
#include <termios.h> /*PPSIX 終端控制定義*/
#include <errno.h> /*錯誤號定義*/

#define FALSE -1
#define TRUE 0

/*********************************************************************/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR | O_NOCTTY ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}

/**
*@brief 設置串口通信速率
*@param fd 類型 int 打開串口的文件句柄
*@param speed 類型 int 串口速度
*@return void
*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
if (speed == name_arr[i]) {
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0) {
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}

/**
*@brief 設置串口數據位,停止位和效驗位
*@param fd 類型 int 打開的串口文件句柄
*@param databits 類型 int 數據位 取值 為 7 或者8
*@param stopbits 類型 int 停止位 取值為 1 或者2
*@param parity 類型 int 效驗類型 取值為N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/
if ( tcgetattr( fd,&options) != 0) {
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*設置數據位數*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size/n"); return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 設置為奇效驗*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 轉換為偶效驗*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;break;
default:
fprintf(stderr,"Unsupported parity/n");
return (FALSE);
}
/* 設置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits/n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 設置超時15 seconds*/
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}

int main(int argc, char **argv)
{

int fd;
int nread;
char buff[512];
char *dev = "/dev/ttyS0"; //串口二
fd = OpenDev(dev);
set_speed(fd,4800);
if (set_Parity(fd,8,1,'N') == FALSE)
{
printf("Set Parity Error/n");
exit (0);
}
int i;
i = getchar();
if ( i == '1')
{
while (1) //循環讀取數據
{
while((nread = read(fd, buff, 512))>0)
{
printf("/nLen %d/n",nread);
buff[nread+1] = '/0';
printf( "/n%s", buff);
}
}
}
if ( i == '2')
{
while (1) //循環寫入數據
{

gets(buff);

printf("------buff--->%s<--------/n",buff);
int num = strlen(buff);
printf("--------num---->%d<--------------/n",num);
if ( num > 0)
{
printf("Wirte num not NULL./r/n");
nread = write(fd, buff ,num);
if(nread == -1)
{
printf("Wirte sbuf error./n");
}
printf("--nread---->%d<-----------/n",nread);
}

}
}
close(fd);
//exit (0);
}

B. 如何在Linux下統計高速網路中的流量

Linux下統計高速網路流量方法如下:

在Linux中有很多的流量監控工具,它們可以監控、分類網路流量,以花哨的圖形用戶界面提供實時流量分析報告。大多數這些工具(例如:ntopng,iftop )都是基於libpcap 庫的,這個函數庫是用來截取流經網卡的數據包的,可在用戶空間用來監視分析網路流量。盡管這些工具功能齊全,然而基於libpcap庫的流量監控工具無法處理高速(Gb以上)的網路介面,原因是由於在用戶空間做數據包截取的系統開銷過高所致。
在本文中我們介紹一種簡單的Shell 腳本,它可以監控網路流量而且不依賴於緩慢的libpcap庫。這些腳本支持Gb以上規模的高速網路介面,如果你對「匯聚型」的網路流量感興趣的話,它們可統計每個網路介面上的流量。
腳本主要是基於sysfs虛擬文件系統,這是由內核用來將設備或驅動相關的信息輸出到用戶空間的一種機制。網路介面的相關分析數據會通過「/sys/class/net/<ethX>/statistics」輸出。
舉個例子,eth0的網口上分析報告會輸出到這些文件中:
/sys/class/net/eth0/statistics/rx_packets: 收到的數據包數據
/sys/class/net/eth0/statistics/tx_packets: 傳輸的數據包數量
/sys/class/net/eth0/statistics/rx_bytes: 接收的位元組數
/sys/class/net/eth0/statistics/tx_bytes: 傳輸的位元組數
/sys/class/net/eth0/statistics/rx_dropped: 收包時丟棄的數據包
/sys/class/net/eth0/statistics/tx_dropped: 發包時丟棄的數據包
這些數據會根據內核數據發生變更的時候自動刷新。因此,你可以編寫一系列的腳本進行分析並計算流量統計。下面就是這樣的腳本(感謝 joemiller 提供)。第一個腳本是統計每秒數據量,包含接收(RX)或發送(TX)。而後面的則是一個描述網路傳輸中的接收(RX)發送(TX)帶寬。這些腳本中安裝不需要任何的工具。
測量網口每秒數據包:
#!/bin/bash

INTERVAL="1" #update interval in seconds

if [ -z "$1" ]; then
echo
echousage: $0 [network-interface]
echo
echoe.g. $0 eth0
echo
echoshows packets-per-second
exit
fi

IF=$1

while true
do
R1=`cat/sys/class/net/$1/statistics/rx_packets`
T1=`cat/sys/class/net/$1/statistics/tx_packets`
sleep$INTERVAL
R2=`cat/sys/class/net/$1/statistics/rx_packets`
T2=`cat/sys/class/net/$1/statistics/tx_packets`
TXPPS=`expr$T2 - $T1`
RXPPS=`expr$R2 - $R1`
echo"TX $1: $TXPPS pkts/s RX $1: $RXPPS pkts/s"
done

網路帶寬測量
#!/bin/bash

INTERVAL="1" #update interval in seconds

if [ -z"$1" ]; then
echo
echousage: $0 [network-interface]
echo
echoe.g. $0 eth0
echo
exit
fi

IF=$1

while true
do
R1=`cat/sys/class/net/$1/statistics/rx_bytes`
T1=`cat/sys/class/net/$1/statistics/tx_bytes`
sleep$INTERVAL
R2=`cat/sys/class/net/$1/statistics/rx_bytes`
T2=`cat/sys/class/net/$1/statistics/tx_bytes`
TBPS=`expr$T2 - $T1`
RBPS=`expr$R2 - $R1`
TKBPS=`expr$TBPS / 1024`
RKBPS=`expr$RBPS / 1024`
echo"TX $1: $TKBPS kb/s RX $1: $RKBPS kb/s"
done

下面的屏幕截圖顯示了上面的兩個腳本的輸出。

C. Linux串口連接ttyS0、ttyS1是什麼意思

這是通信串口名稱。
在Linux環境下,串口名從ttyS0開始依次是ttyS1、ttyS2等。在本程序中,使用ttyS0作為通信串口。在打開ttyS0的時候,選項 O_NOCTTY 表示不能把本串口當成控制終端,否則用戶的鍵盤輸入信息將影響程序的執行; O_NDELAY表示打開串口的時候,程序並不關心另一端 的串口是否在使用中。在Linux中,打開串口設備和打開普通文件一樣,使用的是open()系統調用。比如我么打開串口設備1也就是COM1,只需要:
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY );
打開的串口設備有很多設置選項。本文中使用int setup_com(int fd)設置。在系統頭文件中 定義了終端控制結構struct termios,tcgetattr()和tcsetattr()兩個系統函數獲得和設置這些屬性。結構 struct termios中的域描述的主要屬性包括:
c_cflag : 控制選項
c_lflag : 線選項
c_iflag : 輸入選項
c_oflag :輸出選項
c_cc :控制字元
c_ispeed :輸入數據波特率
c_ospeed :輸出數據波特率
如果要設置某個選項,那麼就使用"|=「運算,如果關閉某個選項就使用」&=「和」~"運算。本文使用的各個選項的意義定義如下:
c_cflag:
CLOCAL 本地模式,不改變埠的所有者
CREAD 表示使能數據接收器
PARENB 表示偶校驗
PARODD 表示奇校驗
CSTOPB 使用兩個停止位
CSIZE 對數據的bit使用掩碼
CS8 數據寬度是8bit
c_lflag:
ICANON 使能規范輸入,否則使用原始數據(本文使用)
ECHO 回送(echo)輸入數據
ECHOE 回送擦除字元
ISIG 使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信號
c_iflag:
IXON 使能輸出軟體控制
IXOFF 使能輸入軟體控制
IXANY 允許任何字元再次開啟數據流
INLCR 把字元NL(0A)映射到CR(0D)
IGNCR 忽略字元CR(0D)
ICRNL 把CR(0D)映射成字元NR(0A)
c_oflag: OPOST 輸出後處理,如果不設置表示原始數據(本文使用原始數據)
c_cc[VMIN]: 最少可讀數據
c_cc[VTIME]: 等待數據時間(10秒的倍數)

D. Linux 用C寫串口(modem)(急!)

是的,linux是linus
tovalds當時為了研究一個多用戶多任務操作系統,用c代碼編寫了一個很小的操作系統內核,他把這個源碼公布,大家都來修改它和發展它,最終發展成現在的linux操作系統.

閱讀全文

與linuxechoe相關的資料

熱點內容
如何用python寫vlookup函數 瀏覽:794
社保加密狗廠商 瀏覽:212
php編譯運行說法 瀏覽:953
程序員說喂 瀏覽:238
抖音直播雲伺服器 瀏覽:627
一加7pro文件夾data 瀏覽:424
程序員淋雨 瀏覽:947
python輸出數字序列中的空格 瀏覽:78
怎麼將pdf文件大小 瀏覽:734
氧原子相對分子量演算法 瀏覽:988
加密機為什麼是安全的 瀏覽:451
單片機拼音輸入法 瀏覽:789
蘋果筆記本t2加密晶元怎麼打開 瀏覽:796
安卓如何把手機投屏至電視 瀏覽:739
方舟編譯器現在可提速哪些軟體 瀏覽:60
微信加密為什麼是黑屏 瀏覽:473
android去電狀態 瀏覽:604
蘋果13如何加密視頻 瀏覽:815
linuxweblogic緩存 瀏覽:69
雲伺服器不同地域 瀏覽:946