Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / [Linux GCC] Помогите разобраться с Com портом / 7 сообщений из 7, страница 1 из 1
16.12.2011, 10:47
    #37579199
Vint_x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linux GCC] Помогите разобраться с Com портом
Всем привет, не так давно возникла необходимость пересесть на линукс и написать программку для вывода данных на дисплейчик
GU140x32F-7806A, работающий через COM порт с такими настройками: 38400 N 1
Опыта работы с компортом в линуксе нет, но благо у гугла всегда что то да найдётся.
Через стороннюю программку для работы с ком портом можно без труда выводить данные, но как не пытался вывести через свою, ничего не выходит, молчит как партизан.
Вот пример моей функции, посылающая на /dev/ttyS0 данные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
int sendTo(char *portName, const unsigned char *message, size_t len) {
	struct termios tio;
	int tty_fd;
	fd_set rdset;

	memset(&tio,0,sizeof(tio));
	tio.c_iflag=0;
	tio.c_oflag=0;
	tio.c_cflag=CS8|CREAD|CLOCAL;           
	tio.c_lflag=0;
	tio.c_cc[VMIN]=1;
	tio.c_cc[VTIME]=5;
	printf("Open %s\n", portName);
	tty_fd=open(portName, O_RDWR | O_NOCTTY | O_NONBLOCK);
	if(tty_fd == -1) {
		perror("Port not open");
		return -1;
	}
	cfsetospeed(&tio,B38400);
	cfsetispeed(&tio,B38400);

	tcsetattr(tty_fd,TCSANOW,&tio);

	int result;
	do {
		result = write(tty_fd, message,len);
		if(result == -1) {
			perror("Error");
			close(tty_fd);
			return -1;
		}		
		message += result;
		len -= result;
	} while(len > 0);

	close(tty_fd);
	return 0;
}



Так же пробовал через готовую либу http://cboard.cprogramming.com/networking-device-communication/119973-rs232-serial-port-library-linux-windows.html] RS232 serial port library for Linux
но тоже результата 0
...
Рейтинг: 0 / 0
16.12.2011, 12:21
    #37579369
JoFan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linux GCC] Помогите разобраться с Com портом
Vint_x,

Код: sql
1.
2.
	message += result;
	len -= result;



шо эта за бред ?

и перепиши свой код с анализом кодов возвратов, тогда и поговорим
...
Рейтинг: 0 / 0
16.12.2011, 13:01
    #37579425
Vint_x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linux GCC] Помогите разобраться с Com портом
JoFan если не умеете работать с указателями, курите в сторонке.
Вопрос в другом. И "умного" из себя корчить не надо.
Этот "бред" сделан на случай, если не все байты проглотить устройство.
...
Рейтинг: 0 / 0
16.12.2011, 13:51
    #37579532
JoFan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linux GCC] Помогите разобраться с Com портом
Vint_xJoFan если не умеете работать с указателями, курите в сторонке.
Вопрос в другом. И "умного" из себя корчить не надо.
Этот "бред" сделан на случай, если не все байты проглотить устройство.

да, я ненавижу работать с указателями, это для меня как красная тряпка, т.к. это потенциальный источник ошибок
если устройство не проглотило заданное количество байт - я бы лучше вернул ошибку сразу

попробуй так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
termios tty;
tcgetattr(_handle, &tty);
	cfsetospeed(&tty, (speed_t)B38400);
	cfsetispeed(&tty, (speed_t)B38400);
	tty.c_cflag &= ~(CS5 | CS6 | CS7 | CS8);
	tty.c_cflag |= CS8;
	tty.c_cflag &= ~CRTSCTS;
	tty.c_iflag = IGNBRK;
	tty.c_lflag = 0;
	tty.c_oflag = 0;
	tty.c_cflag |= CLOCAL | CREAD;
	tty.c_cc[VMIN] = 1;  //Принимать каждый символ
	tty.c_cc[VTIME] = 0; //Блокироваться при пустом буфере
	tty.c_iflag &= ~(IXON|IXOFF|IXANY);
	tty.c_cflag &= ~(PARENB | PARODD);  //Без контроля
	tty.c_cflag |= CSTOPB; //2 стопа
tcsetattr(_handle, TCSANOW, &tty);
...
Рейтинг: 0 / 0
16.12.2011, 14:39
    #37579697
Vint_x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linux GCC] Помогите разобраться с Com портом
JoFan, Спасибо.

С дисплеем связаться удалось. Оказываться проблема крылась совсем не в этом.
Почему то после последней команды дисплею (ttyS3) и до закрытия порта надо отправить на порт ttyS1 что нибудь и тогда всё заработает.
Не пойму, как они связанны, если физически подключен только один порт.

Сейчас сделал при помощи обёртки RS232 serial port library for Linux, как отлажу, перепишу полностью сам, что б лучше понимать работу портов в линухе.
...
Рейтинг: 0 / 0
16.12.2011, 14:58
    #37579777
Vint_x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linux GCC] Помогите разобраться с Com портом
Методом тыка получилось следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include <stdlib.h>
#include <stdio.h>

#include <unistd.h>
#include "rs232.h"

void printBytes(const unsigned char *ptStr, size_t len) {
	while(len--)
		printf("%0.2x ", *ptStr++);
	printf("\n");
}

int main(int argc, char *argv[]) {

	int bdrate=38400;
	int serialNum = 3;
	int serialAlt = 1;

	if(argc < 2) return -1;

	char buffer[256];

	//CMD Clear 		0x0f 0x01
	//CMD Set Cursor 	0x0f 0x80

	sprintf(buffer, "\x0f\x01\x0f\x80%s", argv[1]);

	OpenComport(serialNum, bdrate);

	printf("Send: ");
	printBytes(buffer, strlen(buffer));

	SendBuf(serialNum, buffer, strlen(buffer));
	//
	OpenComport(serialAlt, bdrate);
	SendBuf(serialAlt, "\x0", 1);
	CloseComport(serialAlt);
	//
	CloseComport(serialNum);

   printf("END\n");
   return 0;
}

Ну вот понять ни как не могу, почему надо хоть что то отправить на порт 1 (ttyS1), что бы в дисплей пришли команды. В другом случае программка просто подвиснет
...
Рейтинг: 0 / 0
16.12.2011, 17:03
    #37580181
JoFan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Linux GCC] Помогите разобраться с Com портом
Vint_x,

может быть есть какая особенность этого дисплея, что он ждет 0xD и/или 0xA в конце ?

в последний раз я воспользовался библиотекой http://code.google.com/p/qextserialport/
посмотри как там реализуется работа именно в отношении инициализации и работы
для чистого C наверно тоже есть библиотеки, самому писать врятли целесообразно, разве что для изучения или если нельзя стороннее применять
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / [Linux GCC] Помогите разобраться с Com портом / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]