免费手机网站制作app,临沂网站建设 百度优化,各大网站开发语言,ps做的网页怎么导入网站1.windows配置
首先是windows端#xff0c;启动TCP服务端#xff0c;用来监听指定的端口号#xff0c;其中IP地址可以设置为任意#xff0c;否则服务器可能无法正常打开。
addrSer.sin_addr.S_un.S_addr INADDR_ANY;
recv函数用来接收客户端传输的数据#xff0c;其中…1.windows配置
首先是windows端启动TCP服务端用来监听指定的端口号其中IP地址可以设置为任意否则服务器可能无法正常打开。
addrSer.sin_addr.S_un.S_addr INADDR_ANY;
recv函数用来接收客户端传输的数据其中sum表示接收到的字节数。
为了能将接收到的char数据转换成16进制形式方便与发送数据进行比对。
rece ToHexString((unsigned char*)recvbuf, sum);
这里sum不能替换为strlen(recvbuf)strlen在检测到00后会自动结束打印的数据不全。
string ToHexString(unsigned char* input, int datasize)
{stringstream ss;ss setbase(16) setfill(0);for (int i 0; i datasize; i)ss setw(2) (UINT)input[i];return ss.str();
}
TCP接收到的不是一个一个的数据而是一段一段的数据中间可能包含着多条信息需要根据起始位将信息提取出来。
vectorint positions findAllSubstringPositions(rece, aaa55a);
vectorstring s;
if(positions.size()0){s.push_back(rece.substr(0, positions[0] 2));for (int i 1; i positions.size(); i) {cout positions[i - 1] endl;s.push_back(rece.substr(positions[i-1] 2, positions[i]- positions[i - 1]));}s.push_back(rece.substr(positions[positions.size()-1]2));
}
else {s.push_back(rece);
}
for(int j0;j positions.size();j)cout s[j] endl;
这里由于不知道一段包含命令的个数所以用vector容器来存放比较合适同时substr第一个参数是起始位置第二个参数是需要提取字符串的长度不是终止位置。 2.WSL配置
WSL作客户端用来监听串口数据并返还给服务端。
第一步让WSL可以检测到USB
powershell输入usbipd list查看当前USB设备电脑间测试需要串口盒辅助另外一台电脑打开串口调试助手向WSL发送十六进制数据
usbipd bind --busid 1-6 共享串口 usbipd attach --wsl -b 1-6 附加USB设备到WSL上
WSL输入lsusb检测当前USB设备
ls /dev/tty*查看USB设备的端口号
第二步WSL开启串口监听
根据查询到的端口号配置端口 //listen uartfd1 open( /dev/ttyS9, O_RDWR);if (fd1 -1) {printf(open error!\n);}int nset set_opt(fd1, 115200, 8, N, 1);if (nset -1) {printf(set error!\n);}
第三步配置接收线程
主函数开启线程std::thread uart(uart_read);
while(1)循环里连续接收n read(fd1, send_buf, UART_BUFF);
n表示接收到的字符串长度这里read可能会分段接收加入起始位和长度的判断 if(n0){if(n2){if(ToHexString((unsigned char*)send_buf,2) a55a){flag1;count0;memset(rece_buf,\0,UART_BUFF);numchar (unsigned char)send_buf[2];sum (int)numchar;}}if(flag){for(int icount;i(countn);i){rece_buf[i] send_buf[i-count];}count n;if(sum (count-2)){cout ToHexString((unsigned char*)rece_buf,sum2) endl;lensend(client_sockfd, rece_buf, count, 0);//TCP客户端发送count 0;}else if(sum (count-2)){flag 0;count 0;}}}
这里数据的长度为unsigned char类型用int强转
count表示接收到的字符串长度其中rece_buf不能使用strcat来进行拼接还是00的问题。
第四步文件编译
一般的文件编译使用gcc -o 工程名 工程文件的格式
而std::thread则要
g -o 工程名 工程文件名 -lpthread -stdc11
执行 ./工程名 完整代码
#includeiostream
#includecstring
#includeunistd.h
#includesys/types.h
#includesys/socket.h
#includenetinet/in.h
#includearpa/inet.h
#include termios.h
#include stdio.h
#include fcntl.h
#include sys/stat.h
#include unistd.h
#include thread
#include time.h
#include exception
#include syslog.h
#include stdlib.h
#include sstream
#include iomanip
#include stringusing namespace std;
typedef unsigned int UINT;
#define UART_BUFF 2048int client_sockfd;
int len;
int fd1-1;string ToHexString(unsigned char* input, int datasize)
{stringstream ss;ss setbase(16) setfill(0);for (int i 0; i datasize; i)ss setw(2) (UINT)input[i];return ss.str();
}int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{struct termios newtio,oldtio;if ( tcgetattr( fd,oldtio) ! 0){perror(SetupSerial 1);return -1;}bzero( newtio, sizeof( newtio ) );newtio.c_cflag | CLOCAL | CREAD;newtio.c_cflag ~CSIZE;switch( nBits ){case 7:newtio.c_cflag | CS7;break;case 8:newtio.c_cflag | CS8;break;}switch( nEvent ){case O:newtio.c_cflag | PARENB;newtio.c_cflag | PARODD;newtio.c_iflag | (INPCK | ISTRIP);break;case E:newtio.c_iflag | (INPCK | ISTRIP);newtio.c_cflag | PARENB;newtio.c_cflag ~PARODD;break;case N:newtio.c_cflag ~PARENB;break;}switch( nSpeed ){case 2400:cfsetispeed(newtio, B2400);cfsetospeed(newtio, B2400);break;case 4800:cfsetispeed(newtio, B4800);cfsetospeed(newtio, B4800);break;case 9600:cfsetispeed(newtio, B9600);cfsetospeed(newtio, B9600);break;case 115200:cfsetispeed(newtio, B115200);cfsetospeed(newtio, B115200);break;case 460800:cfsetispeed(newtio, B460800);cfsetospeed(newtio, B460800);break;default:cfsetispeed(newtio, B9600);cfsetospeed(newtio, B9600);break;}if( nStop 1 )newtio.c_cflag ~CSTOPB; else if ( nStop 2 )newtio.c_cflag | CSTOPB;newtio.c_cc[VTIME] 0;newtio.c_cc[VMIN] 0;tcflush(fd,TCIFLUSH);if((tcsetattr(fd,TCSANOW,newtio))!0){perror(com set error);return -1;}return 0;
}void uart_read(){char send_buf[UART_BUFF];int flag0;int sum0,count0;char rece_buf[UART_BUFF];char send_buf_use[UART_BUFF];string numStr;unsigned char numchar;int n;while(1){n read(fd1, send_buf, UART_BUFF);//cout n endl;if(n0){if(n2){if(ToHexString((unsigned char*)send_buf,2) a55a){flag1;count0;memset(rece_buf,\0,UART_BUFF);numchar (unsigned char)send_buf[2];sum (int)numchar;// cout ToHexString((unsigned char*)send_buf,n) *** endl;}}if(flag){cout ToHexString((unsigned char*)send_buf,n) *** endl;for(int icount;i(countn);i){rece_buf[i] send_buf[i-count];}count n;//cout ToHexString((unsigned char*)rece_buf,count) endl;if(sum (count-2)){cout ToHexString((unsigned char*)rece_buf,sum2) endl;lensend(client_sockfd, rece_buf, count, 0);count 0;}else if(sum (count-2)){flag 0;count 0;}}}//else//usleep(5000);}return;
}int main()
{struct sockaddr_in remote_addr;char recv_buf[UART_BUFF];char send_buf[UART_BUFF];memset(remote_addr, 0, sizeof(remote_addr));remote_addr.sin_familyAF_INET;remote_addr.sin_addr.s_addrinet_addr(192.168.192.100);remote_addr.sin_porthtons(6666);//listen uartfd1 open( /dev/ttyS9, O_RDWR);if (fd1 -1) {printf(open error!\n);}int nset set_opt(fd1, 115200, 8, N, 1);if (nset -1) {printf(set error!\n);}//IPv4 tcpif((client_sockfdsocket(PF_INET, SOCK_STREAM, 0))0){coutsocket error;return 1;}if(connect(client_sockfd, (struct sockaddr*)remote_addr, sizeof(struct sockaddr))0){coutconnect error;return 1;} coutconnected to serverendl;std::thread uart(uart_read);while(1){usleep(100);}uart.join();close(client_sockfd);close(fd1);return 0;
}