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

嵌入式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 }


这是我写的代码,不过测试时候,一直在网口通讯被阻塞,不能实现通讯串口和网口的实时通讯,求指教修改
...全文
818 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jklinux 2017-10-20
  • 打赏
  • 举报
回复
用个子线程专门接收串口数据或接收网络数据就可以了

1,317

社区成员

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

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