시리얼을 통해 내 arduino와 이야기하기 위해 C++ 코드를 작성했습니다. 사인과 코사인을 사용하여 두 개의 서보 모터에서 진동을 만들려고 시도하지만 데이터는 건너 뜁니다. 왜 이런 일이 일어나고 있는지 모르겠습니다. serialios에 termios.h를 사용하고 있습니다. C + +에서 출력은 "V180H90"즉, 수직 180, 수평 90과 같습니다. fstream과 usleep()을 사용하여 이전에 데이터를 전송했지만 작동 중이었지만 임의의 수만큼 지연하는 것보다 나은 방법을 사용하고 싶습니다. .데이터를 보낼 때 직렬 포트가 데이터를 건너 뛰는 이유는 무엇입니까?
도움이나 도움을 주셔서 감사합니다.
내 아두 이노 코드
#include <Servo.h>
typedef enum { NONE, GOT_V, GOT_H } states;
states state = NONE;
Servo pan;
Servo tilt;
int laser = 11;
unsigned int currentValue;
int v_pan = 0;
int v_tilt = 0;
void setup()
{
pan.attach(10);
tilt.attach(9);
Serial.begin(9600);
state = NONE;
}
void processVertical(const unsigned int value)
{
Serial.print("Vertical = ");
Serial.println(value);
int result = 1300 + (value - 90) * 2;
//Serial.println(result);
tilt.writeMicroseconds(result);
}
void processHorizontal(const unsigned int value)
{
Serial.print("Horizontal = ");
Serial.println(value);
int result = 1500 + (value - 180) * 1;
//Serial.println(result);
pan.writeMicroseconds(result);
}
void handlePreviousState()
{
switch(state)
{
case GOT_V:
processVertical(currentValue);
break;
case GOT_H:
processHorizontal(currentValue);
break;
}
currentValue = 0;
}
void processIncomingByte (const byte c)
{
if (isdigit(c))
{
currentValue *=10;
currentValue += c - '0';
}
else
{
handlePreviousState();
switch (c)
{
case 'V':
state = GOT_V;
break;
case 'H':
state = GOT_H;
break;
default:
state = NONE;
break;
}
}
}
void loop()
{
if(Serial.available() > 0)
{
processIncomingByte(Serial.read());
}
digitalWrite(laser, HIGH);
}
//check out writeMicroseconds
내 C++ 코드 당신은 빨리 당신이 그것을 다시 읽을 수있는 것보다 데이터를 침되어있는 시리얼 장치와 그 장치 자체에 너무 빨리 데이터를 작성하는
// Program for sending data to serial
#include <iostream>
#include <sstream>
#include <string>
#include <termios.h>
#include <fcntl.h>
#include <math.h>
using namespace std;
//open serial port
int openPort(string path)
{
int fd; //file descriptor for port
fd = open(path.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
cerr << "Cannot open port" << endl;
else
fcntl(fd, F_SETFL, 0);
return (fd);
}
//set options for an open serial port
void setOptions(int fd)
{
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
//No parity 8N1
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
//No flow control
options.c_cflag &= ~CRTSCTS;
//Turn off s/w flow control
options.c_iflag &= ~(IXON | IXOFF | IXANY);
//Turn on read and ignore ctrl lines
options.c_cflag |= (CLOCAL | CREAD);
if(tcsetattr(fd, TCSANOW, &options) < 0) {
cerr << "Could not set attributes" << endl;
}
}
//write to serial port
void writePort(int fd, string data)
{
int n = write(fd, data.c_str(), 9);
if (n < 0)
cerr << "Cannot write to port" << endl;
}
int main() {
string path = "/dev/tty.usbmodemfd131";
//string path = "/dev/tty.usbmodemfa141";
int fd = openPort(path);
setOptions(fd);
stringstream ss;
string output;
unsigned short vertical = 0;
unsigned short horizontal = 0;
unsigned short freq = 10;
for(int i = 0; i < 360; i++) {
vertical = ((cos(i * freq * ((M_PI)/180))) + 1) * 90;
horizontal = ((sin(i * freq * ((M_PI)/180))) + 1) * 90;
ss << "V" << vertical << "H" << horizontal << endl;
output = ss.str();
ss.str("");
writePort(fd, output);
// cout << output; //DEBUG
}
close(fd);
return 0;
}
나쁜 농담처럼 들리는 군 ... * 직렬 포트가 데이터를 건너 뛴 이유는 무엇입니까? * – thang
EOP (종결 자) 추가를 시도한 적이 있습니까? – KMC
같은 컴퓨터의 터미널 프로그램에 "C++ 코드"(Linux라고 가정합니다)를 연결하면 어떻게됩니까? 그것을 확인하는 것으로 시작하십시오. 그런 다음 보낸 사람 또는받는 사람이 범인인지 여부를 결정할 수 있습니다. – Lundin