資源簡介
串口轉TCP組件 (Ubuntu、openwrt實測可用),采用C語言編寫,單文件,可直接編譯。
同時包含python的服務器端。

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include? ?//標準輸入輸出定義
#include? //標準庫函數定義
#include? //UNIX標準函數定義
#include??//基本系統數據類型
#include???//獲取一些文件相關的信息
#include? ?//文件控制定義
#include?
#include???//錯誤號定義
#include???//標準輸入輸出定義
#include??//標準函數庫定義
#include??//Unix標準函數定義
#include?
#include?
#include????//文件控制定義
#include??//POSIX中斷控制定義
#include????//錯誤號定義
#include?
#include?
//?#define?DEST_PORT?9999?//目標地址端口號
//?#define?DEST_IP?“61.153.226.170“?/*目標地址IP,這里設為本機*/
//?#define?DEST_IP?“101.6.65.194“?/*目標地址IP,這里設為本機*/
//?#define?MAX_DATA?256?//接收到的數據最大程度
#define?serial_device?“/dev/ttyS1“
struct?thread_info{
int?sockfd;
int?fd;
char*?buff;
};
//打開串口
int?open_port(void)
{
int?fd;?//串口的標識符
//O_NOCTTY用來告訴Linux這個程序不會成為“控制終端”
//O_NDELAY用來告訴Linux這個程序不關心DCD信號
fd?=?open(serial_device?O_RDWR?|?O_NOCTTY?|?O_NDELAY);
if?(fd?==?-1)
{
//不能打開串口
perror(“open_port:?Unable?to?open?/dev/ttyS0?-“);
return?(fd);
}
else
{
fcntl(fd?F_SETFL?0);
printf(“open?ttys1?.....\n“);
return?(fd);
}
}
void?set_speed_and_parity(int?fd?int?speed)
{
struct?termios?options;??//?串口配置結構體
tcgetattr(fd?&options);?//獲取當前設置
bzero(&options?sizeof(options));
options.c_cflag?|=?B115200?|?CLOCAL?|?CREAD;?//?設置波特率,本地連接,接收使能
options.c_cflag?&=?~CSIZE; ?//屏蔽數據位
options.c_cflag?|=?CS8; ?//?數據位為?8?,CS7?for?7
options.c_cflag?&=?~CSTOPB; ?//?一位停止位,?兩位停止為?|=?CSTOPB
options.c_cflag?&=?~PARENB; ?//?無校驗
?//options.c_cflag?|=?PARENB;?//有校驗
//options.c_cflag?&=?~PARODD?//?偶校驗
//options.c_cflag?|=??PARODD????//?奇校驗
options.c_cc[VTIME]?=?6; ??//?等待時間,單位百毫秒?(讀)。后有詳細說明
options.c_cc[VMIN]?=?0; ??//?最小字節數?(讀)。后有詳細說明
tcflush(fd?TCIOFLUSH); ??//?TCIFLUSH刷清輸入隊列。
tcsetattr(fd?TCSANOW?&options);?//?TCSANOW立即生效;
}
int?serialport()
{
int?fd;
//打開串口
if?((fd?=?open_port())?0)
{
perror(“open_port?error“);
return?0;
}
//設置波特率和校驗位
set_speed_and_parity(fd?115200);
return?(fd);
}
void?Ser2TCP(int?sockfd?int?fd?char?*buff)
{
int?nread;
while?(1)
{
//讀取串口
nread?=?read(fd?buff?128);
if?(nread?>?0)
{
//?printf(“nLen?%dn\n“?nread);
buff[nread?+?1]?=?0;
//?printf(“n%s\n“?buff);
//?TCP發送數據
send(sockfd?buff?nread?0);
}
else
{
sleep(1);
}
}
}
void?Ser2TCP_thread(void?*Tinfo){
Ser2TCP(((struct?thread_info?*)Tinfo)->sockfd?((struct?thread_info?*)Tinfo)->fd((struct?thread_info?*)Tinfo)->buff);
}
void?TCP2Ser(int?sockfd?int?fd?char?*buff)
{
int?nread;
while?(1)
{
//?TCP?接收數據
sleep(1);
nread?=?recv(sockfd?buff?1024?0);?//將接收數據打入buf,參數分別是句柄,儲存處,最大長度,其他信息(設為0即可)。
//?printf(“TCP?nLen?%dn\n“?nread);
//寫回串口
write(fd?buff?nread);
}
}
void?TCP2Ser_thread(void?*Tinfo){
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????1114??2018-07-26?08:33??README.md
?????文件????????5417??2018-07-26?08:32??tcpclient.c
?????文件?????????495??2018-07-26?02:08??tcpclient.py
?????文件?????????721??2018-07-26?02:09??tcpserver.py
評論
共有 條評論