很奇怪Java怎么都遍历不到输出方向的串口,如下图所示
然后
用Java就无法成功发出数据,想了半天没想到解决方法,索性就用c++传,c++很给力,能成功连接串口,于是就用c++作为服务端,Java作为客户端,这里只需要自己编写自己对应部分的代码就ok,
麻烦的是Java向c++传指令时要注意在数据后面加一个\0,因为c中数据是以这个结尾的,另外char型数组要用num【number】形式来比较。
c++代码如下
#include <WINSOCK2.H> #include <stdio.h> #include<iostream> #include<windows.h> #define PORT 5150 #define MSGSIZE 1024 #pragma comment(lib, "ws2_32.lib") using namespace std; int main() { HANDLE hcom; hcom = CreateFile("COM2",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_NORMAL,NULL); SetupComm(hcom,4096,4096); DCB dcb; GetCommState(hcom,&dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = 0; dcb.StopBits = 1; SetCommState(hcom,&dcb); char stop[]="$0,0,0#"; char forward[]="$1,0,0#"; char backoff[]="$2,0,0#"; char left_turn[]="$3,0,0#"; char right_turn[]="$4,0,0#"; DWORD dwWrittenLen = 0; //int k=0; WSADATA wsaData; SOCKET sListen; SOCKET sClient; SOCKADDR_IN local; SOCKADDR_IN client; char szMessage[MSGSIZE]; //char szMessage; int a; int ret; int iaddrSize = sizeof(SOCKADDR_IN); WSAStartup(0x0202, &wsaData); sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); local.sin_family = AF_INET; local.sin_port = htons(5150); local.sin_addr.s_addr = htonl(INADDR_ANY); bind(sListen, (struct sockaddr *) &local, sizeof(SOCKADDR_IN)); listen(sListen, 1); sClient = accept(sListen, (struct sockaddr *) &client, &iaddrSize); printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); while (TRUE) { if(ret = recv(sClient, szMessage, MSGSIZE, 0)) { ret = recv(sClient, szMessage, MSGSIZE, 0); szMessage[ret] = ‘\0‘; /* if(!WriteFile(hcom,data,8,&dwWrittenLen,NULL)) { fprintf(stderr, "发送数据失败!\n"); } k++; */ if (szMessage[0]==1){ a=2; } else if(szMessage[0]==2){ a=3; } else if(szMessage[0]==3){ a=1; } else if(szMessage[0]==4){ a=4; } else if(szMessage[0]==5){ a=5; } switch(a){ case 1: WriteFile(hcom,left_turn,8,&dwWrittenLen,NULL); printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); break; case 2: WriteFile(hcom,forward,8,&dwWrittenLen,NULL); printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); break; case 3: WriteFile(hcom,backoff,8,&dwWrittenLen,NULL); printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); break; case 4: WriteFile(hcom,right_turn,8,&dwWrittenLen,NULL); printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); break; case 5: WriteFile(hcom,stop,8,&dwWrittenLen,NULL); printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); break; } /* if(ret==0x00){ } if(ret==1){ } if(ret==11){ WriteFile(hcom,backoff,8,&dwWrittenLen,NULL); printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); } if(ret==3){ WriteFile(hcom,left_turn,8,&dwWrittenLen,NULL); printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); } if(ret==4){ WriteFile(hcom,right_turn,8,&dwWrittenLen,NULL); printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); } */ /* printf("往串口发送数据成功!第%d次\n" ,k); Sleep(1*1000); //10s发送一次 printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage); */ } } return 0; }
Java如下 其中监听key 创建一个面板是必要的,只有这样才能一直监听。
import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.Socket; /** * @Author:Tianye Long * @Description: * @Date:2020/1/2 10:38 * @Version:1.8 */ public class ARCar extends JFrame { Socket socket=new Socket("127.0.0.1",5150); public static PrintWriter printWriter; MyPanel myPanel=null; public static void main(String[] args) throws IOException { ARCar arCar=new ARCar(); } public ARCar() throws IOException { printWriter=new PrintWriter(socket.getOutputStream(), true); myPanel=new MyPanel(); this.add(myPanel); this.addKeyListener(myPanel); this.setSize(400,200); this.setLocation(100,100); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } class MyPanel extends JPanel implements KeyListener{ char a=1; char b=2; char c=3; char d=4; char f=5; @Override public void paint(Graphics g) { super.paint(g); } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_W) { for (int i = 0; i <2 ; i++) { ARCar.printWriter.println(a); } } else if (e.getKeyCode() == KeyEvent.VK_S) { for (int i = 0; i < 2; i++) { ARCar.printWriter.println(b+"\0"); } } else if (e.getKeyCode() == KeyEvent.VK_A) { for (int i = 0; i < 2; i++) { ARCar.printWriter.println(c+"\0"); } } else if (e.getKeyCode() == KeyEvent.VK_D) { for (int i = 0; i < 2; i++) { ARCar.printWriter.println(d+"\0"); } }else if (e.getKeyCode() == KeyEvent.VK_F) { for (int i = 0; i < 2; i++) { ARCar.printWriter.println(f+"\0"); } } } @Override public void keyReleased(KeyEvent e) { } }
原文:https://www.cnblogs.com/JLU-Dragon/p/12134593.html