2016-01-19 2 views
3

Это, вероятно, тривиально, но я не могу понять, почему я не читаю обратно в своей программе. Кажется, он отлично работает для всего «сложного материала», и он говорит, что он прочитал 1 (символ/байт), но я не могу его схватить; это похоже на проблемы с сопоставлением типов (это действительно странно, компилятор g ++ (т. е. gcc) btw).Передача буфера чтения данных

Как я изменяю разные варианты Buf (как указатель, char, char array и т. Д.) Я не могу получить доступ к входу.

SO ниже - это урезанный код и версия для синхронизации. Который также должен скомпилировать.

#define WIN32_LEAN_AND_MEAN 
#include <stdio.h> 
#include <windows.h> 
using namespace std; 

//********************************** 
//******* M A I N **************** 
//********************************** 

int main()  
{ 

HANDLE hComm; 
int choice; 

// non overlap test case (2nd last par = 0) 

hComm = CreateFile("COM4", 
        GENERIC_READ | GENERIC_WRITE, 
        0, 
        NULL, 
        OPEN_EXISTING, 
        0, 
        0); 

if (hComm == INVALID_HANDLE_VALUE){ 
    // error opening port; abort 
    printf("open error COM4\n"); 
    } 
else 
    printf("COM4 open"); 

printf("\n Hi, this is a UART attempt:"); scanf("%d", &choice); 


// build the control block 

DCB   dcb={0}; 


printf("******dcb******\n"); 

dcb.DCBlength = sizeof(dcb); 

if (!GetCommState(hComm, &dcb)) printf("Get DCB error"); // I dont think this should be needed ? 


if (! BuildCommDCB("4800,n,8,2" , &dcb)) { 
    // error 
    printf("COM4 buidDCB -- error\n"); 
    return(1); 
    } 


printf("****here*****\n"); 

// put the control block into action 

if (! SetCommState(hComm, &dcb) ){ 
    // error 
    printf("COM4 setCommState -- error:%d \n",(int)GetLastError()); 
    return(1); 
    } 

printf("seem successfull \n"); 


/*************************************READ non-ASYNC TESTING ************************************/ 
/********************************************************************************************/ 

char Buf[1]; 

/* initiate waiting for reading on UART */ 

DWORD dwRead; 

// Issue rea 


if (! ReadFile(hComm, Buf, 1 , &dwRead, 0)) { 
     // Error in communications; report it. 
     printf("ReadFile --- error:%d",(int)GetLastError()); 
} 
else {  
    // read completed 
    printf("read <%d>---%o--- \n",(int)dwRead,Buf[0]); 
} 


return 0; 
} //*** end main ************************************ 
+1

В то время как я ценю ваше попытайтесь урезать вопрос до разумного минимума, это все еще не [минимальный рабочий пример] (https: // stackoverflow.com/help/mcve) в том смысле, что он может быть скомпилирован и протестирован изолированно. Я также думаю, что вы должны редактировать свои теги. Кажется, что в вашем коде есть много специфических элементов Windows (?). – 5gon12eder

+0

Хорошо, возможно, я должен попытаться подставить этот текст с помощью компиляционного урезанного варианта, скоро сделаю, если я не получу свою голову вокруг этого через некоторые советы. – Georg

+0

ТЕПЕРЬ для БОЛЬШОГО ИЗБИРАТЕЛЬНОГО МЕНЯ: самые трудные ошибки, которые можно найти, - это те, которые не являются ошибками. SBS (= дерьмо за задним колесом) было проблемой. Оказывается, что код полностью жизнеспособен и работает. Только то, что я читал один персонаж, и я не понимал, что дефис (oct55) был первым персонажем, который я отправил по линии UART. Также на линии был начальный мусор. (ваше исправление для [] было правильным, хотя) Так извините, спасибо за помощь./georg – Georg

ответ

1

Вы собираетесь пнуть себя: Проблема заключается в том, что окончательное printf (для отображения значения) должно быть:

printf("--- immediate read <%d>---%o--- \n",(int)dwRead,Buf[0]); 

Примечание задн [0] на Buf.

В качестве альтернативы, вы можете объявить Buf как:

char Buf; 

, а затем вызов будет:

if (! ReadFile(hComm, &Buf, 1, &dwRead, &osReader)) { 

(. С & на Buf)

+0

Привет, спасибо, я попробую это (хотя я думаю, что попробовал это). У меня действительно есть проблема с различием между char Buf и char Buf [], я понимаю, что компилятор видит последний как int, а первый как char * передается как параметр. – Georg

+0

№. Компилятор видит в качестве символа 'char' (который преобразуется в' int' в большинстве выражений), а другой как «массив' char' »(который преобразуется в« указатель на 'char'» в большинстве выражений). Понимание различия между «массивом» и «указателем на символ» является критическим. Я так понимаю, вы имеете в виду, что вам «трудно заметить» разницу, а не «затруднение понимания» («видение» может означать и то и другое). –

+0

Нахх, хорошо спасибо; для меня это говорит о том, что C++ - это патч, это сочетание между «Да, мы идем на язык высокого уровня (со всеми вводами и т. д.)» и фактически обрабатываем артефакты с низким уровнем реализации. Однако его неконструктивный для меня, чтобы войти в это «философское мышление». – Georg