问题描述
我正在尝试使用 win32 api 和 C 语言写入和读取串行端口 (arduino)。我想向arduino发送一个数字,计算那里的平方并通过C程序读取它。但是对于下面的代码,程序要么离开循环,要么不读取传入的数据。我的 C 代码:
#include <stdio.h>
#include <windows.h>
#include <string.h>
#define BUFFER_SIZE 256
int main(){
HANDLE hComm = INVALID_HANDLE_VALUE;
hComm = CreateFile("\\\\.\\COM5",GENERIC_READ | GENERIC_WRITE,NULL,OPEN_EXISTING,NULL);
if(hComm == INVALID_HANDLE_VALUE){
printf("CreateFile() Failed\n");
return -1;
}else{
printf("CreateFile() succeeded\n");
}
DCB dcb;
memset(&dcb,sizeof(DCB));
if(!GetCommState(hComm,&dcb)){
printf("GetCommState() Failed\n");
return -1;
}
printf("## PLEASE SELECT FROM THE FOLLOWING ##\n");
printf("## MENU : ##\n");
printf("(1) TURN ON LED ON ARDUINO\n");
printf("(2) TURN OFF LED ON ARDUINO\n");
printf("(3) FLASH ARDUINO 3 TIMES\n");
printf("(4) SEND A NUMBER TO ARDUINO TO COmpuTE SQUARE BY ARDUINO\n");
printf("(5) Button press counter (bonus item) **not working**\n");
printf("(0) EXIT\n");
char writeBuff[BUFFER_SIZE];
char readBuff;
char buff[BUFFER_SIZE];
char intSend[6];
int choice;
int writtenBytes = 0;
int allReadBytes = 0;
int readByte = 0;
int i = 0;
char abc[10];
unsigned char loop = 0;
int a;
int index = 0;
do{
printf("PLEASE SELECT: ");
scanf("%d",&choice);
switch(choice){
case 1:
strcpy(writeBuff,"a");
if(WriteFile(hComm,writeBuff,1,(LPDWORD)&writtenBytes,NULL)){
if(writtenBytes == 0){
printf("WriteFile() timed out \n");
return -1;
}
}else{
printf("WriteFile() Failed\n");
return -1;
}
printf("%d bytes were written\n",writtenBytes);
writtenBytes = 0;
break;
case 2:
strcpy(writeBuff,"b");
if(WriteFile(hComm,writtenBytes);
writtenBytes = 0;
break;
case 3:
strcpy(writeBuff,"c");
if(WriteFile(hComm,&writtenBytes,writtenBytes);
writtenBytes = 0;
break;
case 4:
printf_s("Please enter a number\n");
scanf_s(" %s",&abc);
writeBuff[0] = abc[0];
writeBuff[1] = abc[1];
writeBuff[2] = abc[2];
WriteFile(hComm,sizeof(writeBuff),NULL);
do{
ReadFile(hComm,&readBuff,sizeof(readBuff),&readByte,NULL);
buff[loop]=readBuff;
++loop;
}while(readByte > 0);
--loop;
a = index;
for(index = a; index < loop; ++index){
printf_s("%c",buff[index]);
}
break;
}
}while(choice != 0);
if(!CloseHandle(hComm)){
printf("CloseHandle() Failed\n");
return -1;
}
return 0;
}
使用调试器,我注意到 ReadFile 读取我从 C 程序发送的内容,而不是 arduino 发送到串行端口的内容。我还测试了用数字 12 打开 LED 灯,它可以工作,所以我确定我可以用 WriteFile 发送数据。我的arduino代码:
int i;
String value;
long sqCalc;
long karesi;
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,LOW);
}
void loop() {
if(Serial.available() > 0){
value = Serial.readString();
Serial.println(value);
if(value == "a"){
digitalWrite(LED_BUILTIN,HIGH);
Serial.println("LED is ON");
delay(250);
}else if(value == "b"){
digitalWrite(LED_BUILTIN,LOW);
Serial.println("LED is OFF");
}else if(value == "c"){
if(digitalRead(LED_BUILTIN) == HIGH){
for(i=0;i<3;i++){
digitalWrite(LED_BUILTIN,LOW);
delay(250);
digitalWrite(LED_BUILTIN,HIGH);
delay(250);
}
}
if(digitalRead(LED_BUILTIN) == LOW){
for(i=0;i<3;i++){
digitalWrite(LED_BUILTIN,HIGH);
delay(250);
digitalWrite(LED_BUILTIN,LOW);
delay(250);
}
}
}
sqCalc = value.toInt();
if(sqCalc > 0){
karesi = pow(sqCalc,2);
Serial.println(karesi,DEC);
}
}
}
最后,使用 PuTTy 测试了 arduino 代码,效果很好。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)