|
| VB 2010: COM порт |
| xxxmonejall |
Дата: Вт, 03.01.2012, 01:39 | Сообщение # 1 |
Группа: Проверенные Ранг: Продвинутый
Сообщений: 133
Замечания: ±На сайте с 17.05.2008
Статус: Offline
|
Доброго времени суток. В программирование полный ноль:) Так что сильно не пинайте. задача состоит в том что нужно принимать данные с ком порта, и рисовать по них график. Все вроде бы работает, с микроконтроллера данные посылаются, моя программа их принимает.Но замечен глюк от 0 до 99 график рисуется, но только переходит за 100 начинаются глюки. Прилагаю фото графика и сам исходник. Может кто что подскажет, извините если что не так Но это первая моя программа на ПК. Раньше никогда не писал. Да и еще с контролера данные идут такие как нужно смотрел через терминал.
include "MODEDEFS.BAS" @ device pic16F84A, xt_osc, wdt_off, protect_off, pwrt_on Define CHAR_PACING 500 DEFINE OSC 4 Trisb = %00000000 diodes var word diodes = 0 main: diodes = diodes + 1
serout portb.1, T9600, [#diodes,13] pause 50 portb.3 = 1 pause 50 portb.3 = 0 pause 50 goto main
______________________________________________________________________________________________________________ Public Class TEST
Dim data_from_port As String = 0 Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Control.CheckForIllegalCrossThreadCalls = False
End Sub
Public Sub Chart1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Chart1.Click
End Sub
Public Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
End Sub
Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click SerialPort1.PortName = ComboBox1.Text SerialPort1.BaudRate = ComboBox2.Text SerialPort1.WriteTimeout = 500 SerialPort1.ReadTimeout = 500 SerialPort1.StopBits = ComboBox3.Text SerialPort1.DataBits = ComboBox4.Text SerialPort1.Open()
If SerialPort1.IsOpen = True Then Button2.Visible = True End If If SerialPort1.IsOpen = True Then Button1.Visible = False End If End Sub
Public Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If SerialPort1.IsOpen = True Then SerialPort1.Close() End If If SerialPort1.IsOpen = False Then Button2.Visible = False End If If SerialPort1.IsOpen = False Then Button1.Visible = True End If
End Sub
Public Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
End Sub
Public Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
End Sub
Public Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
data_from_port = SerialPort1.ReadExisting() TextBox1.Text = data_from_port Chart1.Series("Форсунка 1").Points.AddY(data_from_port)
End Sub
Private Sub ComboBox4_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox4.SelectedIndexChanged
End Sub
Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged
End Sub
Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
End Sub
Private Sub Label4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label4.Click
End Sub End Class
|
|
| | |
| ADMIN |
Дата: Вт, 03.01.2012, 18:50 | Сообщение # 2 |
Администратор
Группа: Администраторы Ранг: МАСТЕР
Сообщений: 824
Замечания: ±На сайте с 20.08.2007
Статус: Offline
|
Надо при отладке смотреть что попадает в data_from_port. Скорей всего дело в строке: Chart1.Series("Форсунка 1").Points.AddY(data_from_port) Разве точка добавляется как String? |
|
| | |
| xxxmonejall |
Дата: Чт, 05.01.2012, 11:07 | Сообщение # 3 |
Группа: Проверенные Ранг: Продвинутый
Сообщений: 133
Замечания: ±На сайте с 17.05.2008
Статус: Offline
|
Я это уже пробовал менять:( Ничего не вышло. Гипер терминалом с контролера все гуд. А тут на тебе:( Может с настройкой порта что-то, слышал что есть такая штука как проверка четности и бытности ну или что-то типа того. Но как с с этим работать не знаю. |
|
| | |
| ADMIN |
Дата: Чт, 05.01.2012, 17:51 | Сообщение # 4 |
Администратор
Группа: Администраторы Ранг: МАСТЕР
Сообщений: 824
Замечания: ±На сайте с 20.08.2007
Статус: Offline
|
Что пробовал менять? И что не вышло? Если гипертерминалом все ОК, то причем тут четность? Я говорю, что нужно запустить приложение пошагово и передавать в COM данные. И пошагово смотреть, что попадает в Chart после 99. |
|
| | |
| xxxmonejall |
Дата: Пт, 06.01.2012, 23:21 | Сообщение # 5 |
Группа: Проверенные Ранг: Продвинутый
Сообщений: 133
Замечания: ±На сайте с 17.05.2008
Статус: Offline
|
Все:) Наконец то понял в чем проблема: поменял DEFINE char_pacing 1000 на 100 (задержка между передачей знаков на МК) А в программе на ПК SerialPort1.ReadTimeout = 10000 И все как-бы заработало, но замечены все же не приятные глюки. Збои начались после числа 400. Радует только то что ясна причина:) Есть еще один вопросик: можно ли сделать так чтобы мк отправил что-то и ждал пока с ПК не придет команда что данные получены, и аж тогда отправлял следующие данные дальше, и чтоб та же история была на пк? |
|
| | |
| ADMIN |
Дата: Сб, 07.01.2012, 05:23 | Сообщение # 6 |
Администратор
Группа: Администраторы Ранг: МАСТЕР
Сообщений: 824
Замечания: ±На сайте с 20.08.2007
Статус: Offline
|
Я вот не понимаю - 'вроде бы заработало, но как-бы глючит'. Насчет второго вопроса - у команды serout есть модификатор 'wait' |
|
| | |
| xxxmonejall |
Дата: Сб, 07.01.2012, 18:38 | Сообщение # 7 |
Группа: Проверенные Ранг: Продвинутый
Сообщений: 133
Замечания: ±На сайте с 17.05.2008
Статус: Offline
|
Quote Насчет второго вопроса - у команды serout есть модификатор 'wait' Синтаксис команды serout: serout Pin, mode, [Item {, Item...}] По книге хилинского. Так где там есть wait??? Вот в serout2 есть такая штука как FlowPin, вот это как раз то что мне нужно. Или я просто что-то не так понял? |
|
| | |
| ADMIN |
Дата: Сб, 07.01.2012, 19:55 | Сообщение # 8 |
Администратор
Группа: Администраторы Ранг: МАСТЕР
Сообщений: 824
Замечания: ±На сайте с 20.08.2007
Статус: Offline
|
Извиняюсь, оговорился. Конечно, не у команды SEROUT, а у команды SERIN2. То есть, команда serin2, в которой можно указать модификатор Wait, будет ожидать указанную в модификаторе последовательность в течение определенного времени и перейдет на метку, в зависимости от результата. Насчет FlowPin не разбирался, не знаю. |
|
| | |
| ADMIN |
Дата: Сб, 07.01.2012, 20:18 | Сообщение # 9 |
Администратор
Группа: Администраторы Ранг: МАСТЕР
Сообщений: 824
Замечания: ±На сайте с 20.08.2007
Статус: Offline
|
Кстати здесь есть пример с использованием этого модификатора, правда на протоне и с командой HSERIN. Думаю, смысл будет понятен |
|
| | |
| xxxmonejall |
Дата: Чт, 23.02.2012, 00:27 | Сообщение # 10 |
Группа: Проверенные Ранг: Продвинутый
Сообщений: 133
Замечания: ±На сайте с 17.05.2008
Статус: Offline
|
Доброго времени суток. Есть вопрос: С устройства на микроконтроллере по УСАРТ приходит куча разной информации в таком виде: F1 = 21321, F2 = 3434, F3 = 654645, F4 = 23423, RPM = 3434 и еще кучу всего. ловлю все это на пк и вывожу в TextBох, и там это все это вижу так-же все это можно записать в переменную и что угодно с этим делать. Как на Basice можно это все отфильтровать, как значение после F1 = записать в переменную F1, а значение после F2 = в переменную F2 и тд... Может кто что посоветует??? |
|
| | |
| DAlexV |
Дата: Чт, 23.02.2012, 11:59 | Сообщение # 11 |
Группа: Модераторы Ранг: Разобрался
Сообщений: 514
Замечания: ±На сайте с 13.05.2008
Статус: Offline
|
В VB6 есть функция SPLIT. В VB2010 наверное то же есть. Гонишь данные через в числовом виде через запятую например. Апосля чего запускаешь функцию SPLIT и получаешь массив с разделенными данными. Работает быстрее чем MID$ http://www.picbasic.ru/forum/9-141-1529-16-1234283755 (спасибо ALEXу, за подсказку)
a() = Split(C_Port.Data_Resive, ",")
Res_Data.Dat_A = Val(Trim(a(0))) / 10 Res_Data.Dat_B = Val(Trim(a(1))) / 10 Res_Data.Dat_C = Val(Trim(a(2))) / 10 Res_Data.PID = Val(Trim(a(3)))
пример для изучения http://www.picbasic.ru/forum/9-141-2291-16-1243695810 (VER4.rar)
Успехов
Будьте оригинальны - не повторяйте чужих ошибок !!!! Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :) |
|
| | |
| xxxmonejall |
Дата: Сб, 25.02.2012, 03:05 | Сообщение # 12 |
Группа: Проверенные Ранг: Продвинутый
Сообщений: 133
Замечания: ±На сайте с 17.05.2008
Статус: Offline
|
Большое спасибо.... буду разбираться:) |
|
| |
Форум разработчиков электроники. Последние сообщения 
|