Re: C언어 기준으로 ss=15 명령어를 보내고 문자열 파싱 코드
페이지 정보
본문
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hSerial;
DCB dcbSerialParams = { 0 };
COMMTIMEOUTS timeouts = { 0 };
char ss_data[] = "ss=15\r\n";
DWORD bytes_written, bytes_read;
char incoming_data[1024];
int size = 12;
double array[12];
// Open the serial port
hSerial = CreateFile(L"\\\\.\\COM17",
GENERIC_READ | GENERIC_WRITE, // Read/Write Access
0, // No Sharing, ports cant be shared
NULL, // No Security
OPEN_EXISTING, // Open existing port only
0, // Non Overlapped I/O
NULL);
if (hSerial == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "Error opening serial port.\n");
return -1;
}
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams))
{
fprintf(stderr, "Error getting serial port state.\n");
CloseHandle(hSerial);
return -1;
}
dcbSerialParams.BaudRate = CBR_115200;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams))
{
fprintf(stderr, "Error setting serial port state.\n");
CloseHandle(hSerial);
return -1;
}
//Setting Timeouts
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (SetCommTimeouts(hSerial, &timeouts) == FALSE)
{
printf_s("\nError to Setting Time outs");
return -1;
}
#if 0 //처음 보낼 때만 하고 그 다음에는 1 에서 0으로 변경하세요
// [Send] ss=15
if (!WriteFile(hSerial, ss_data, sizeof(ss_data), &bytes_written, NULL))
{
fprintf(stderr, "Error writing to serial port.\n");
CloseHandle(hSerial);
return 1;
}
printf("Data Send: %s", ss_data);
#endif
if (!ReadFile(hSerial, incoming_data, sizeof(incoming_data), &bytes_read, NULL))
{
fprintf(stderr, "Error reading from serial port.\n");
CloseHandle(hSerial);
return -1;
}
incoming_data[bytes_read] = '\0';
printf("recv: %s", incoming_data);
//C언어로 기준으로 " " 파싱
char* token = strtok(incoming_data, " ");
int count = 0;
while (token != NULL && count < size) {
array[count] = atof(token);
token = strtok(NULL, " ");
count++;
}
//배열 출력
for (int i = 0; i < count; i++) {
printf("Value[%d]: %.3lf\n", i, array[i]);
}
CloseHandle(hSerial);
return 0;
}
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hSerial;
DCB dcbSerialParams = { 0 };
COMMTIMEOUTS timeouts = { 0 };
char ss_data[] = "ss=15\r\n";
DWORD bytes_written, bytes_read;
char incoming_data[1024];
int size = 12;
double array[12];
// Open the serial port
hSerial = CreateFile(L"\\\\.\\COM17",
GENERIC_READ | GENERIC_WRITE, // Read/Write Access
0, // No Sharing, ports cant be shared
NULL, // No Security
OPEN_EXISTING, // Open existing port only
0, // Non Overlapped I/O
NULL);
if (hSerial == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "Error opening serial port.\n");
return -1;
}
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams))
{
fprintf(stderr, "Error getting serial port state.\n");
CloseHandle(hSerial);
return -1;
}
dcbSerialParams.BaudRate = CBR_115200;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams))
{
fprintf(stderr, "Error setting serial port state.\n");
CloseHandle(hSerial);
return -1;
}
//Setting Timeouts
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (SetCommTimeouts(hSerial, &timeouts) == FALSE)
{
printf_s("\nError to Setting Time outs");
return -1;
}
#if 0 //처음 보낼 때만 하고 그 다음에는 1 에서 0으로 변경하세요
// [Send] ss=15
if (!WriteFile(hSerial, ss_data, sizeof(ss_data), &bytes_written, NULL))
{
fprintf(stderr, "Error writing to serial port.\n");
CloseHandle(hSerial);
return 1;
}
printf("Data Send: %s", ss_data);
#endif
if (!ReadFile(hSerial, incoming_data, sizeof(incoming_data), &bytes_read, NULL))
{
fprintf(stderr, "Error reading from serial port.\n");
CloseHandle(hSerial);
return -1;
}
incoming_data[bytes_read] = '\0';
printf("recv: %s", incoming_data);
//C언어로 기준으로 " " 파싱
char* token = strtok(incoming_data, " ");
int count = 0;
while (token != NULL && count < size) {
array[count] = atof(token);
token = strtok(NULL, " ");
count++;
}
//배열 출력
for (int i = 0; i < count; i++) {
printf("Value[%d]: %.3lf\n", i, array[i]);
}
CloseHandle(hSerial);
return 0;
}
- 이전글MW AHRS RS-232 텍스트 통신 23.09.21
- 다음글MW-AHRSv1 아두이노를 통하여 사용하고싶습니다. 23.09.12
댓글목록
조용진님의 댓글
조용진 작성일감사합니다. 참고해서 사용해보도록 하겠습니다. 그런데 하나 여쭤보자면 우분투 기반에서 센서를 구동하는데 windows.h 헤더 파일이 사용되는 이유가 따로 있는건가요?
최고관리자님의 댓글의 댓글
최고관리자 작성일아~ 제가 급하게 하다보니 윈도우에서 개발하였습니다. 리눅스는 그거에 맞게 프로그래밍 하시면 됩니다 ㅎㅎㅎ