我有一个微控制器,我想接收并发送数据,所以我尝试使用UART端口来查看是否有可能。我为我的微控制器编写了一个快速程序,它将在LCD屏幕上显示char值(不是字符本身而是ASCII代码),当我按下一个按钮时它会发回76(代码为'L',因为那是所有这个项目都给了我)。然后我为我的Mac下载了CoolTerm(我正在使用Mac,因为这是我学校给我的而不是选择)并插入了this USB到我购买的UART电缆。下载驱动程序后,我启动了CoolTerm,选择了我的端口,并选择了我的波特率。我点击连接并开始按键。当我这样做时,我在我的LCD上得到了正确的相应ASCII值,当我按下微控制器上的按钮时,我的终端确实收到了一个'L'。一切都很完美。然后我下载了jserialcomm并制作了一个小程序,看看我是否可以读取微控制器中的值。当我启动程序时,它只会每隔一个字节读取一次,即使我按下按钮或按住它。它将读取的字节只是1.然后发生了另一个问题。似乎港口没有正确关闭。程序终止后,我尝试再次运行它,它会在尝试打开端口时遇到困难,之后再也不会执行任何代码。当我要终止程序时,它说它“无法终止”然后它,我认为是,强制退出程序。当我回到CoolTerm打开端口时,它会卡在连接和冻结上,我不得不强制退出。为了清楚起见,我使用的是cu。*作为FAQ状态,而不是tty。*
这是我正在使用的Java代码:
//This is what I use to set up the the Port
//This gets all of the ports on the machine
SerialPort[] q;
q = SerialPort.getCommPorts();
//This iterates through the ports and gives a description and the name of the port
for(SerialPort a: q){
System.out.println(a.getDescriptivePortName() + " : " + a.getSystemPortName());
}
//Allows user to select which port they want
System.out.println("Which port do you want?");
Scanner s = new Scanner(System.in);
int portnumber = s.nextInt();
s.close();
//Creates a SerialPort object of the port the user selected and opens it
SerialPort commPort = q[portnumber];
System.out.println(commPort.getDescriptivePortName());
if(commPort.openPort()){
System.out.println("Port Opened");
}else{
System.out.println("Port Failed to Open");
}
commPort.setBaudRate(230400);
//This is the first method I tried
commPort.setComPortTimeouts(SerialPort.TIMEOUT_NONBLOCKING, 1000, 0);
try{
while(true){
//Waits till there are bytes available
while(commPort.bytesAvailable() == 0){
Thread.sleep(20);
}
//Creates a buffer to read the bytes
byte[] readBuffer = new byte[commPort.bytesAvailable()];
int numOfBytes = commPort.readBytes(readBuffer, readBuffer.length);
//Prints out the number of bytes read and the bytes it read
System.out.println("Read " + numOfBytes + " bytes. Message:");
for(byte b: readBuffer){
System.out.println("::::" + Integer.toBinaryString(b & 0xFF));
}
}
}catch(Exception e){
e.printStackTrace();
}
The second method I did was using InputStreams which I would prefer not to use since I rather just read raw bytes in.
答案 0 :(得分:1)
将您的超时编辑为:
commPort.setComPortTimeouts(SerialPort.TIMEOUT_NONBLOCKING, 0, 0);
或删除该行。在你的情况下,你不需要它。为什么奇怪的波特率?有时USB-to-RS232桥接器无法在每个波特率下工作。
9600波特适用于我。
希望这有帮助,
哈尼