Драйвер для графического планшета на C#, нужна помощь
Всем доброго дня. Решил я пару дней назад оживить вот такой старый и вполне рабочий графический планшет. Ребенку поиграться вполне сойдет.
Проблема в нем в том, что драйвера существуют только под Windows 98. С горем пополам они иногда (почти никогда) работают в некоторых сборках Windows XP. Причем в x64 работает все, кроме настроек планшета, в х32 работают настройки и передвижение курсора, но нажатие на любую из кнопок приводит к синему экрану.
На мой комп Win XP не ставится в принципе, вылетает на этапе установки. 98 - ваще не вариант=)
В общем после пары минут размышлений я пришел к выводу, что планшет должен иметь крайне простой протокол и написать программу которая будет получать с него координаты будет не сложно.
Благодаря сниферу СОМ порта вычислил, что протокол передачи данных довольно прост:
Планшет отправляет непрерывный поток данных без разделителей порциями по 5 байт.
data0 | data1 | data2 | data3 | data4 |
Старшая часть координаты Х | Младшая часть координаты У | Старшая часть координаты У | принимает значения: 0x3f кнопка не нажата 0x40 нажата кнопка 1 0x41 нажата кнопка 2 0x42 нажата кнопки 1 и 2 |
Младшая часть координаты Х |
Х=data0+data4*128
Y=data1+data2*128
Программа была успешно написана, и отлично двигала курсор мышки по экрану, намного лучше чем с родными драйверами, т.к. родные драйвера явно работают по таймеру, а мои по SerialDataReceivedEventHandler, т.е. я не пропускаю ни одной координаты. Следовательно движение намного плавнее, разница легко заметна глазу. Все бы было отлично, я бы ходил и радовался, что за вечер написал драйвера намного лучше родных...
Но...
data3 в моей программе всегда равно 0x3f, при этом сниффер перехватывающий данные которые идут к моей программе от планшета показывает и другие значения, если нажму кнопку. Free serial monitor с такими же параметрами тоже видит data3=0x40, 0x41,0x42...
Внимание вопрос, что за хрень???
Подключение к порту делаю так:
SerialPort _serialPort = new SerialPort();
_serialPort.PortName = "COM1";
_serialPort.BaudRate = 9600;
_serialPort.DataBits = 8;
_serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), "RequestToSend", true);
_serialPort.DtrEnable = true;
_serialPort.DataReceived += SerialPortDataReceived;
OpenSerialPort();
Получение данных - так:
private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
var serialPort = (SerialPort)sender;
var data = serialPort.ReadExisting();
//далее поиск в data как в массиве int кодов кнопок и координат.
Подробнее
Forml - □ C0M1 V Poit: COM1 Speed: 9600 Pairy: None Data Bits: 8 Stop Bits: One Handshake: RequestToSend DtrEnable: Tnje Hardware Y=802 Hardware X=1543 12 34 6 63 7 C 22 6 3F 7 ? •f - ? •
C#,сделал сам,нарисовал сам, сфоткал сам, написал сам, придумал сам, перевел сам,программирование,программа,geek porn,нужна помощь,личное,графический планшет,удалённое