开发板使用同一个代码接受通讯口和网口发送的内容,代码怎么写

嵌入式FIRE 2017-10-19 04:36:12
通讯串口测试代码
#define PORT 1234
26 #define MAXDATASIZE 1024
27
28
29
30 int IC_TTY_addToLibIc()
31 {
32 printf("IC_TTY_addToLibIc");
33
34 return 0;
35 }
36
37 int IC_TTY_Option_Set(int fd,int nSpeed,int nBits,char nEvent,int nStop)
38 {
39 struct termios newtio,oldtio;
40 //保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息
41 if(tcgetattr(fd,&oldtio)!=0)
42 {
43 printf("SetupSerial 1");
44 return -1;
45 }
46
47 bzero(&newtio,sizeof(newtio));
48 //设置字符大小
49 newtio.c_cflag |= CLOCAL |CREAD;
50 newtio.c_iflag &= ~CSIZE;
51 //设置数据位
52 switch(nBits)
53 {
54 case 5:
55 newtio.c_cflag |= CS5;
56 break;
case 6:
58 newtio.c_cflag |= CS6;
59 break;
60 case 7:
61 newtio.c_cflag |= CS7;
62 break;
63 case 8:
64 newtio.c_cflag |=CS8;
65 break;
66 default:
67 newtio.c_cflag |=CS8;
68 break;
69 }
70 //设置校验位
71 switch(nEvent)
72 {
73 case 'o':
74 newtio.c_cflag |= PARENB;
75 newtio.c_cflag |=PARODD;
76 newtio.c_iflag |=(INPCK | ISTRIP);
77 break;
78
79 case 'E':
80 newtio.c_iflag |=(INPCK | ISTRIP);
81 newtio.c_cflag |=PARENB;
82 newtio.c_cflag &= ~PARODD;
83 break;
84
85 case 'N':
86 newtio.c_cflag &= ~PARENB;
87 break;
88 default:
89 newtio.c_cflag &= ~PARENB;
90 break;
}
93 //设置波特率
94 switch(nSpeed)
95 {
96 case 2400:
97 cfsetispeed(&newtio,B2400);
98 cfsetospeed(&newtio,B2400);
99 break;
100
101 case 4800:
102 cfsetispeed(&newtio,B4800);
103 cfsetospeed(&newtio,B4800);
104 break;
105
106 case 9600:
107 cfsetispeed(&newtio,B9600);
108 cfsetospeed(&newtio,B9600);
109 break;
110
111 case 57600:
112 cfsetispeed(&newtio,B57600);
113 cfsetospeed(&newtio,B57600);
114 break;
115
116 case 115200:
117 cfsetispeed(&newtio,B115200);
118 cfsetospeed(&newtio,B115200);
119 break;
120
121 case 460800:
122 cfsetispeed(&newtio,B460800);
123 cfsetospeed(&newtio,B460800);
124 break;
126 default:
127 cfsetispeed(&newtio,B9600);
128 cfsetospeed(&newtio,B9600);
129 break;
130
131 }
132 //设置停止位
133
134 if(nStop == 1)
135 {
136 newtio.c_cflag &= ~CSTOPB;
137 }
138 else if(nStop == 2)
139 {
140 newtio.c_cflag |= CSTOPB;
141 }
142 //设置等待时间和最小接收字符
143 newtio.c_cc[VTIME] = 0;
144 newtio.c_cc[VMIN] = 1;
145 //处理未接收字符
146 tcflush(fd,TCIFLUSH);
147 //激活新配置
148 if((tcsetattr(fd,TCSANOW,&newtio))!=0)
149 {
150 printf("com set error"); //打印com set error 及出错原因
151 return -1;
152 }
153
154 return 0;
155 }

158 int IC_TTY_Init(const char* pTtyName,int nSpeed,int nBits,char nEvent,int nStop)
159 {
160 if (NULL == pTtyName)
161 {
162 printf("pTtyName is NULL");
163 return -1;
164 }
165
166 int nComFd = 0;
167
168 nComFd = open(pTtyName, O_RDWR|O_NOCTTY);
169 if (nComFd <= 0 )
170 {
171 printf("Couldn't open %s", pTtyName);
172
173 return -2;
174 }
175 else
176 {
177 printf("open %s success!\n", pTtyName);
178 }
179
180
181 IC_TTY_Option_Set(nComFd,nSpeed,nBits,nEvent,nStop);
182
183 // fcntl( nComFd, F_SETFL, 0 ); //阻塞状态
184 fcntl( nComFd, F_SETFL, FNDELAY); //非阻塞状态
185 return nComFd;
186 }
int IC_TTY_Destroy(int nComFd)
189 {
190 if (nComFd > 0)
191 {
192 close(nComFd);
193 }
194
195 return 0;
196 }
197
198
199 int main(int argc,char**argv)
200 {
201 int nSenDevFd = 0;
202 char szBuf[1024] = {0};
203 int nRead = 0;
204 int nWrite = 0;
205
206 if(argc!=2)
207 {
208 printf("Usage:[cmd] [dev]\n");
209 exit(1);
210 }
211 nSenDevFd = IC_TTY_Init(argv[1], 115200, 8, 'N', 1);
212 if (nSenDevFd < 0)
213 {
214 printf("error: open\n");
215 }
int sockfd;
219 struct sockaddr_in server;
220 struct sockaddr_in client;
221 socklen_t addrlen;
222 int num;
223 char buf[MAXDATASIZE];
224
225 if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
226 {
227 perror("Creatingsocket failed.");
228 exit(1);
229 }
230
231 bzero(&server,sizeof(server));
232 server.sin_family=AF_INET;
233 server.sin_port=htons(PORT);
234 server.sin_addr.s_addr= htonl (INADDR_ANY);
235 if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)
236 {
237 perror("Bind error!");
238 exit(1);
239 }
240 addrlen=sizeof(client);
241
242
243 while (1)
244 {
245
246 memset(szBuf, 0, 1024);
247 nRead = read( nSenDevFd, szBuf, 1024);
248
249 if (nRead > 0)
250 {
251 printf("recv %d data: %s\n", nRead, szBuf);
252 nWrite = write(nSenDevFd, szBuf, 1024);
253 continue;
254
255 }
else
258 {
259 num =recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr*)&client,&addrlen);
260
261 if (num < 0)
262 {
263 perror("recvfrom error\n");
264 exit(1);
265 }
266
267 buf[num] = '\0';
268 printf("You got a message ( %s ) from client.\nIt's ip is%s, port is %d.\n",buf,inet_ntoa(client.sin_addr),htons(client.sin_port));
269 sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client,addrlen);
270 }
271 continue;
272 }
273
274 close(sockfd);
275
276 return 0;
277 }


这是我写的代码,不过测试时候,一直在网口通讯被阻塞,不能实现通讯串口和网口的实时通讯,求指教修改
...全文
821 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jklinux 2017-10-20
  • 打赏
  • 举报
回复
用个子线程专门接收串口数据或接收网络数据就可以了
单片机多功能调试助手分两个版本,分别是:含CH375 DLL版本、无DLL版本,它们的区别主要体现在是否对CH37X USB提供支持。为了减少对服务器的负担,现在单片机多功能调试助手只提供无DLL的版本,即不对CH372/CH375 USB芯片提供支持,只支持HID USB设备!含有DLL版本的暂只提供给购买开发板的买家! 在此感谢网络上众多的朋友的反馈与建议,没有他们的支持就没有该软件的茁壮成长!本人会继续努力进行更新,为大家提供一个功能完善与稳定的调试工具,为大家节省不必要的时间。 本软件的使用手册可到www.smartmcu.com进行下载! 作者: 温子祺 联系方式:wenziqi@hotmail.com或wenziqi@gmail.com 博客: http://www.cnblogs.com/wenziqi 淘宝: http://shop61791934.taobao.com/ 官网: www.smartmcu.com 注:软件版权归作者所有,未经作者允许,禁止用于商业用途,违者必究! ===================================================== 2015-12-12 (1)内嵌了蓝牙调试助手功能。 ===================================================== 2015-12-8 (1)在Win7以上系统执行更稳定,默认支持管理员运行。 ===================================================== 2013-07-23 (1)增强稳定性 ===================================================== 2012-05-21 (1)优化了Ping和TCP连接过程 (2)开放了检验源码 ===================================================== 2012-02-06 (1)发送区域支持保存发送数据256字节 ===================================================== 2011-10-17 (1)帧换行功能可调 ===================================================== 2011-07-10 (1)串、USB、网咯接收数据时能够自动对\n和\r\n进行识别 注意:Windows默认对'\r\n'进行换行的 Linux 默认对‘\n’进行换行的 ===================================================== 2011-07-26 (1)修正了PING会出现大延时的问题 (2)修正了网络调试发送计数错误的BUG ===================================================== 2011-07-24 (1)数据校验修正和添加了部分功能 (2)服务器支持多项发送 ===================================================== 2011-07-10 (1)串、USB、网络接收数据时能够自动对\n和\r\n进行识别 注意:Windows默认对'\r\n'进行换行的 Linux 默认对‘\n’进行换行的 ===================================================== 2011-05-05 (1)串调试添加Modem模式 ===================================================== 2011-04-25 (1)修正Ping过慢的BUG ===================================================== 2011-04-20 (1)在接收区添加了右键菜单(清空、显示控制、文本输出控制) ===================================================== 2011-04-13 (1)修正串调试隐藏BUG (2)提升了界面启动的速度 ===================================================== 2011-04-07 (1)发送数据支持回车换行 (2)修正了C51代码向导的BUG ===================================================== 2011-03-31 (1)修改了清空发送和清空接收的BUG ===================================================== 2011-03-24 (1)修改了下载功能 (2)修正了HexToText 和 HexToBin ===================================================== 2011-03-03 (1)在C51代码向导当中增加了计算软件延时的功能 (2)修正了通信端监视不正常的BUG (3)解决了回车键会退出界面的BUG ===================================================== 2011-02-28 (1)在串、USB、网络接收数据的过程中,能够正确显示当前接收数据的速度 (2)在C51代码向导当中增加了输出为Keil工程的功能,方便编译 ===================================================== 2011-02-25 (1)增加了双击文本框可以保存数据记录的功能 (2)增加了Hex/Bin文件输出文本的功能 ===================================================== 2011-02-20 (1)修正了在连续发送的逻辑BUG (2)修正了串监视关闭时发生内存错误的BUG ===================================================== 2011-02-13 (1)修正了在无USB HID设备的情况下还能够打开USB设备的BUG ===================================================== 2011-02-11 (1)修正了界面风格,防止在不同的系统显示不一致! ===================================================== 2011-02-07 (1)修复了部分BUG,如串高级监视、代码生成等。 (2)编码转换增强、调试工具增强(支持帧换行,方便分析数据)! (3)USB支持自动寻找设备! ===================================================== 2011-01-31 (1)添加了串高级监视功能,能够监视其他应用程序的串通信。 (2)添加了8051单片机代码生成功能。(懒人的必备O(∩_∩)O哈哈~) ===================================================== 2011-01-15 (1)修正了发送大量数据出错的BUG ===================================================== 2011-01-13 (1)修正了串、USB、网络监视的BUG ===================================================== 2011-01-08 (1)新增加COM、USB、NET多项发送功能,更加利于调试! ===================================================== 2011-01-02 (1)调整了界面,让其显示更加多的数据! ===================================================== 2010-12-28 (1)修正Hex接收会出错的BUG ===================================================== 2010-12-21 (1)完美支持中文字数据收发 ===================================================== 2010-12-14 (1)修正COM、USB、NET、SERVER接收数据时会出现乱码的BUG (2)优化了线程接收数据的策略 ===================================================== 2010-12-10 (1)支持USB、网络接监视 (2)优化了自动升级策略 (3)增强了位图输出16进制数功能(支持单色图、16位图、24位图) (4)具有自动保存参数功能 ===================================================== 2010-12-02 (1)修正了串检测、接收策略, (2)添加了串监视功能 (3)添加了BCC校验 (4)增强字模制作功能(支持特殊字符、英文、汉字等) ===================================================== 2010-11-29 (1)添加了记录发送、接收字节数的统计功能 (2)添加了自动检测新版本的功能 ===================================================== 2010-11-25 (1)添加了连续发送的功能 (2)添加了在线下载新版本的功能 (3)完善服务器功能 (4)完善了字模输出(摆脱外接字符文件) (5)完善了位图转16进制文件功能,可保存为C文件 ===================================================== 2010-11-02 (1)添加了服务器功能,网络调试更方便! (2)界面更加宽阔,显示更多的信息! ===================================================== 2010-09-26 (1)修正了单片机功能助手运行时间长导致的假死问题。(多谢网友提供宝贵的意见) ===================================================== 2010-09-01 (1)修正了串类,提升接收数据的效率。 ===================================================== 2010-08-03 (1)在检验值计算支持TCP/IP校验和计算 (2)在NET调试新增加了Ping功能 ===================================================== 2010-07-28 (1)修正CRC计算错误 ===================================================== 2010-07-15 (1)修正打开关闭串,接收数据文本框数据丢失 (2)串对话框更为简洁

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧