Making an application that uses a dial-up modem is not only tricky because of the hardware-software connection, but also for finding the right hardware and setting it up properly.

Be careful when you are buying a modem for caller id, make sure not only that it says «Support caller id», but it must NOT have the word «(optional)». If you are not sure ask the seller to verify it.

The code in VB.Net is really simple. But you must be careful of 2 things:

  • If you have to get caller id info and use it, ALWAYS, create a second application and find a way to pass the data to the main one.
  • Use timers and boolean flags to process the data from the modem. When you try to get the data right away it fails. You need to give the modem time to process the call and return the data in its own time.

    Private Sub InitPorts()
        Dim objSerialPort As SerialPort
         objSerialPort = New System.IO.Ports.SerialPort(Me.components)
         objSerialPort.PortName = sCurrentPort._sComPortName
         objSerialPort.ParityReplace = &H3B                    ‘ replace «;» when parity error occurs
         objSerialPort.BaudRate = 9600
         objSerialPort.Parity = IO.Ports.Parity.None
         objSerialPort.DataBits = 8
         objSerialPort.StopBits = IO.Ports.StopBits.One
         objSerialPort.Handshake = IO.Ports.Handshake.None
         objSerialPort.RtsEnable = False
         objSerialPort.ReceivedBytesThreshold = 1             ‘threshold: one byte in buffer > event is fired
         objSerialPort.NewLine = vbCr         ‘ CR must be the last char in frame. This terminates the SerialPort.readLine
         objSerialPort.ReadTimeout = 30000
         objSerialPort.Open()
         objSerialPort.DataReceived, AddressOf SerialPort_DataReceived
    End Sub
    Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
        Dim CurrentSerialPort As SerialPort = CType(sender, SerialPort)
   ‘  Your code here
    End Sub

Finally, in order to get the modem ready, to get the caller’s id, you have to pass the next 3 commands to it:

AT+GCI=B4             (B4 sets UK, 46 sets Greece, 42 sets Germany)
AT+FCLASS=8        (making it voice modem)
AT+VCID=1             (activate caller id)

Personally, I tried to set one up in UK and later in Greece, the UK (B4) worked right away without any problems, but in Greece it looks like (46) is not always the case. With Cosmote (46) worked fine, but with Wind (46) didn’t work. And because some suggested that Greece is following the German standards, I tried (42) and it worked.

Here are some country+codes BUT always check the manual. More for command and help here.

Code Country Code Country
09 Australia 6C Malaysia
0A Austria 73 Mexico
0F Belgium 7B Netherlands
20 Canada 7E New Zealand
31 Denmark 82 Norway
72 Europe 26 People’s Republic of China
3C Finland 89 Philippines
3D France 8B Portugal
04 or 42 Germany 9C Singapore
46 Greece 9F South Africa
50 Hong Kong A0 Spain
51 Hungary A5 Sweden
53 India A6 Switzerland
54 Indonesia A9 Thailand
57 Ireland AE Turkey
59 Italy B4 United Kingdom
00 Japan B5 United States of America
61 Korea BC Vietnam

Use PUTTY to check the modem and it’s support for caller id.

If you want to check what are the possible values of a command use the question mark like this: AT+GCI=?

If you want to check what is the current value of a command use the question mark like this: AT+GCI?

I found that the following site helpful, with troubleshooting : Modem-Frustration

If you have any questions or you need help with coding your application, please, send as an email and we will be happy to share our code and/or our experience with you.

info (at) smobilesoft (dot) com